Perintah Linux / Unix: expr

Nama

expr - Menilai ungkapan

Sinopsis

expr arg ? arg arg ... ?

Concatenates arg (menambah ruang pemisah di antara mereka), menilai hasilnya sebagai ungkapan Tcl, dan mengembalikan nilai. Pengendali yang dibenarkan dalam ekspresi Tcl adalah subset dari pengendali yang dibenarkan dalam ekspresi C, dan mereka mempunyai makna yang sama dan keutamaan sebagai operator C yang sama. Ungkapan hampir selalu menghasilkan hasil numerik (nilai integer atau floating-point). Sebagai contoh, ungkapan itu

expr 8.2 + 6

menilai hingga 14.2. Ekspresi Tcl berbeza dari ekspresi C dengan cara yang dikenal pasti. Juga, ungkapan Tcl menyokong pengendali bukan angka dan perbandingan rentetan.

Beroperasi

Ungkapan Tcl terdiri daripada kombinasi pengendali, operator, dan kurungan. Ruang putih boleh digunakan di antara pengendali dan pengendali dan kurungan; ia tidak diendahkan oleh arahan ungkapan itu. Jika mungkin, operan ditafsirkan sebagai nilai integer. Nilai integer boleh ditentukan dalam perpuluhan (kes normal), dalam oktaf (jika aksara pertama operan adalah 0 ), atau dalam heksadesimal (jika dua aksara pertama operan adalah 0x ). Jika pengendali tidak mempunyai salah satu format integer yang diberikan di atas, maka ia dianggap sebagai nombor terapung jika itu mungkin. Nombor terapung boleh dinyatakan dalam mana-mana cara yang diterima oleh penyusun C yang mematuhi ANSI (kecuali bahawa akhiran f , F , l , dan L tidak dibenarkan dalam kebanyakan pemasangan). Sebagai contoh, semua yang berikut adalah nombor terapung yang sah: 2.1, 3., 6e4, 7.91e + 16. Sekiranya tiada tafsiran angka boleh dilakukan, maka pengendali dibiarkan sebagai rentetan (dan hanya satu set operator yang terhad boleh digunakan untuknya).

Operasi boleh dinyatakan dalam mana-mana cara berikut:

[1]

Sebagai nilai berangka, sama ada integer atau floating-point.

[2]

Sebagai pembolehubah Tcl, menggunakan notasi $ standard. Nilai pembolehubah akan digunakan sebagai pengendali.

[3]

Sebagai rentetan yang disertakan dalam petikan berganda. Pengekspresikan ungkapan akan melakukan backslash, pembolehubah, dan penggantian perintah pada maklumat antara petikan, dan menggunakan nilai yang dihasilkan sebagai pengendali

[4]

Sebagai rentetan tertutup dalam penyokong gigi. Watak-watak antara pendakap terbuka dan penyokong pendekat akan digunakan sebagai pengendali tanpa apa-apa penggantian.

[5]

Sebagai perintah Tcl tertutup dalam kurungan. Perintah itu akan dilaksanakan dan hasilnya akan digunakan sebagai operan.

[6]

Sebagai fungsi matematik yang argumennya mempunyai bentuk di atas untuk operan, seperti sin ($ x) . Lihat di bawah untuk senarai fungsi yang ditentukan.

Di mana penggantian berlaku di atas (contohnya di dalam string yang disebutkan), ia dilakukan oleh arahan ungkapan. Walau bagaimanapun, lapisan penggantian tambahan mungkin telah dilakukan oleh parser arahan sebelum pemproses ungkapan disebut. Seperti yang dibincangkan di bawah, biasanya lebih baik untuk melampirkan ungkapan dalam pendakap untuk menghalang parser arahan daripada melaksanakan penggantian pada kandungan.

Untuk beberapa contoh ungkapan mudah, katakan pemboleh ubah a mempunyai nilai 3 dan pembolehubah b mempunyai nilai 6. Kemudian perintah di sebelah kiri setiap baris di bawah akan menghasilkan nilai di sebelah kanan garisan:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * [llength "6 2"] 8 expr {{word one} <"word $ a"} 0

Pengendali

Pengendali yang sah disenaraikan di bawah, dikumpulkan dalam susunan yang lebih rendah dari keutamaan:

- + ~!

Unary minus, unary plus, bit-wise NOT, logical NOT. Tiada satu daripada pengendali ini boleh digunakan untuk pengendali rentetan, dan TIDAK bijak sedikit boleh digunakan hanya untuk bilangan bulat.

* /%

Maju, kongsi, sisa. Tiada satu daripada operator ini boleh digunakan untuk pengendali rentetan, dan sisanya boleh digunakan hanya untuk bilangan bulat. Selebihnya akan sentiasa mempunyai tanda yang sama dengan pembagi dan nilai mutlak yang lebih kecil daripada pembagi.

+ -

Tambah dan tolak. Sah untuk mana-mana pengendali berangka.

<< >>

Pergeseran kiri dan kanan. Sah untuk integer beroperasi sahaja. Peralihan yang betul sentiasa menyebarkan sedikit tanda.

<> <=> =

Boolean kurang, lebih besar, kurang daripada atau sama, dan lebih besar daripada atau sama. Setiap operator menghasilkan 1 jika keadaan itu benar, sebaliknya. Pengendali ini boleh digunakan untuk rentetan dan juga pengendali berangka, di mana perbandingan rentetan digunakan.

==! =

Boolean sama dan tidak sama. Setiap operator menghasilkan hasil sifar / satu. Sah untuk semua jenis operan.

&

Bijak-bijak DAN. Sah untuk integer beroperasi sahaja.

^

Sempurna bijak ATAU. Sah untuk integer beroperasi sahaja.

|

Bijak-bijak ATAU. Sah untuk integer beroperasi sahaja.

&&

Logik DAN. Menghasilkan 1 hasil jika kedua-dua pengendali tidak sifar, 0 sebaliknya. Sah untuk boolean dan angka (integer atau terapung-titik) hanya beroperasi.

||

Logik ATAU. Menghasilkan hasil 0 jika kedua-dua pengendali adalah sifar, 1 sebaliknya. Sah untuk boolean dan angka (integer atau terapung-titik) hanya beroperasi.

x ? y : z

Jika-kemudian-lain, seperti dalam C. Jika x menilai kepada bukan-nol, maka hasilnya ialah nilai y . Jika tidak, hasilnya ialah nilai z . Operasi x mesti mempunyai nilai berangka.

Lihat manual C untuk maklumat lanjut mengenai hasil yang dihasilkan oleh setiap pengendali. Semua kumpulan operator binari kiri ke kanan dalam tahap pendahuluan yang sama. Sebagai contoh, arahan itu

expr 4 * 2 <7

pulangan 0.

The && , || , dan?: operator mempunyai `` lazy evaluation '', sama seperti dalam C, yang bermaksud bahawa pengendali tidak dinilai jika mereka tidak diperlukan untuk menentukan hasilnya. Sebagai contoh, dalam perintah itu

expr {$ v? [a]: [b]}

hanya satu daripada [a] atau [b] sebenarnya akan dinilai, bergantung kepada nilai $ v . Perhatikan, bagaimanapun, bahawa ini hanya benar jika keseluruhan ungkapan disertakan dalam pendakap; jika tidak, pcler Tcl akan menilai kedua-dua [a] dan [b] sebelum menggunakan arahan eksprr .

Fungsi Matematik

Tcl menyokong fungsi matematik berikut dalam ungkapan:

abs cosh log sqrt acos double log10 srand asin exp pow tan atan floor rand tanh atan2 fmod round ceil hypot sin cos int sinh

abs ( arg )

Mengembalikan nilai mutlak arg . Arg mungkin sama ada integer atau floating-point, dan hasilnya dikembalikan dalam bentuk yang sama.

acos ( arg )

Mengembalikan kosina arka arg , dalam julat [0, pi] radian. Arg sepatutnya berada dalam julat [-1,1].

asin ( arg )

Mengembalikan sinus arka arg , dalam rentang [-pi / 2, pi / 2] radian. Arg sepatutnya berada dalam julat [-1,1].

atan ( arg )

Mengembalikan tangen arka arg , dalam rentang [-pi / 2, pi / 2] radian.

atan2 ( x, y )

Mengembalikan tangen arka y / x , dalam rentang [-pi, pi] radian. x dan y tidak boleh keduanya menjadi 0.

ceil ( arg )

Mengembalikan nilai integer terkecil tidak kurang daripada arg .

cos ( arg )

Mengembalikan kosinus arg , diukur dalam radian.

cosh ( arg )

Mengembalikan kosinus hiperbolik arg . Sekiranya keputusan itu menyebabkan limpahan, ralat akan dikembalikan.

double ( arg )

Jika arg adalah nilai terapung, mengembalikan arg , sebaliknya menukar arg untuk mengambang dan mengembalikan nilai yang ditukar.

exp ( arg )

Mengembalikan eksponen arg , ditakrifkan sebagai e ** arg . Sekiranya keputusan itu menyebabkan limpahan, ralat akan dikembalikan.

lantai ( arg )

Mengembalikan nilai integral yang terbesar tidak lebih besar daripada arg .

fmod ( x, y )

Mengembalikan baki titik terapung pembahagian x dengan y . Sekiranya y adalah 0, ralat akan dikembalikan.

hipot ( x, y )

Mengira panjang hipotenus segi tiga tepat ( x * x + y * y ).

int ( arg )

Jika arg adalah nilai integer, mengembalikan arg , sebaliknya menukar arg kepada integer dengan pemangkasan dan mengembalikan nilai yang ditukar.

log ( arg )

Mengembalikan logaritma semula jadi arg . Arg mesti menjadi nilai positif.

log10 ( arg )

Mengembalikan asas 10 logaritma arg . Arg mesti menjadi nilai positif.

pow ( x, y )

Mengira nilai x yang dibangkitkan kepada kuasa y . Jika x adalah negatif, y mestilah nilai integer.

rand ()

Mengembalikan nombor titik terapung dari sifar kepada hanya kurang daripada satu atau, dalam segi matematik, julat [0,1]. Benih ini berasal dari jam dalaman mesin atau mungkin ditetapkan secara manual dengan fungsi srand.

pusingan ( arg )

Jika arg adalah nilai integer, mengembalikan arg , sebaliknya menukar arg kepada integer dengan pembulatan dan mengembalikan nilai yang ditukar.

dosa ( arg )

Mengembalikan sinus arg , diukur dalam radian.

sinh ( arg )

Mengembalikan sinus hiperbolik arg . Sekiranya keputusan itu menyebabkan limpahan, ralat akan dikembalikan.

sqrt ( arg )

Mengembalikan akar kuasa arg . Arg mestilah tidak negatif.

srand ( arg )

Arg , yang mesti integer, digunakan untuk menetapkan semula benih untuk penjana nombor rawak. Mengembalikan nombor rawak pertama dari benih itu. Setiap jurubahasa mempunyai benih sendiri.

tan ( arg )

Mengembalikan tangen arg , diukur dalam radian.

tanh ( arg )

Mengembalikan tangen hiperbolik arg .

Sebagai tambahan kepada fungsi yang telah ditetapkan ini, aplikasi mungkin menentukan fungsi tambahan menggunakan Tcl_CreateMathFunc ().

Jenis, Limpahan, dan Ketepatan

Semua perhitungan dalaman yang melibatkan bilangan bulat dilakukan dengan panjang C, dan semua perhitungan dalaman yang melibatkan titik terapung dilakukan dengan double type C. Apabila menukar rentetan kepada titik terapung, limpasan eksponen dikesan dan menyebabkan ralat Tcl. Untuk penukaran kepada integer dari rentetan, pengesanan limpahan bergantung kepada tingkah laku beberapa rutin di perpustakaan C tempatan, jadi ia harus dianggap sebagai tidak boleh dipercayai. Walau bagaimanapun, limpahan integer dan aliran bawah biasanya tidak dapat dikesan dengan pasti untuk keputusan pertengahan. Limpahan dan aliran bawah floating-point dikesan ke tahap yang disokong oleh perkakasan, yang umumnya cukup boleh dipercayai.

Penukaran antara representasi dalaman untuk bilangan integer, floating-point, dan string berfungsi secara automatik seperti yang diperlukan. Untuk pengiraan aritmetik, bilangan bulat digunakan sehingga beberapa nombor terapung diperkenalkan, selepas itu titik terapung digunakan. Sebagai contoh,

expr 5/4

pulangan 1, sementara

expr 5 / 4.0 expr 5 / ([panjang tali "abcd"] + 0.0)

keduanya kembali 1.25. Nilai terapung selalu dipulangkan dengan `` . '' atau e supaya mereka tidak kelihatan seperti nilai integer. Sebagai contoh,

expr 20.0 / 5.0

pulangan 4.0 , bukan 4 .

Operasi Rentetan

Nilai-nilai rentetan boleh digunakan sebagai pengendali pengendali perbandingan, walaupun evaluator ungkapan cuba melakukan perbandingan sebagai integer atau floating-point apabila dapat. Jika salah satu pengendali perbandingan adalah rentetan dan yang lain mempunyai nilai numerik, pengendali numerik akan ditukar kembali ke rentetan menggunakan format spektrum C sprintf % d untuk bilangan bulat dan % g untuk nilai terapung. Contohnya, arahan

expr {"0x03"> "2"} expr {"0y" <"0x12"}

kedua-dua pulangan 1. Perbandingan pertama dilakukan dengan menggunakan perbandingan integer, dan yang kedua dilakukan dengan menggunakan perbandingan rentetan setelah operan kedua ditukarkan ke tali 18 . Kerana kecenderungan Tcl untuk merawat nilai-nilai sebagai nombor bila-bila boleh, ia biasanya bukan idea yang baik untuk menggunakan operator seperti == apabila anda benar-benar menginginkan perbandingan rentetan dan nilai-nilai operan dapat sewenang-wenangnya; lebih baik dalam kes ini untuk menggunakan arahan rentetan sebaliknya.

Pertimbangan Prestasi

Nyatakan ungkapan dalam kawat untuk kelajuan terbaik dan keperluan storan terkecil. Ini membolehkan compiler bytecode Tcl untuk menghasilkan kod terbaik.

Seperti yang disebutkan di atas, ungkapan digantikan dua kali: sekali oleh pcl Tcl dan sekali oleh arahan expr . Contohnya, arahan

tetapkan 3 set b {$ a + 2} expr $ b * 4

kembali 11, bukannya berganda 4. Ini kerana pcler Tcl pertama akan menggantikan $ a + 2 untuk pembolehubah b , maka arahan ekspr akan menilai ungkapan $ a + 2 * 4 .

Kebanyakan ungkapan tidak memerlukan penggantian pusingan kedua. Sama ada mereka tertutup dalam pendakap atau, jika tidak, penggantian pembolehubah dan arahan mereka menghasilkan nombor atau rentetan yang tidak memerlukan penggantian. Walau bagaimanapun, kerana beberapa ungkapan tanpa syarat memerlukan dua pusingan penggantian, pengkomputeran bytecode mesti mengeluarkan arahan tambahan untuk menangani keadaan ini. Kod yang paling mahal diperlukan untuk ekspresi tanpa kata yang mengandungi penggantian perintah. Ungkapan ini mesti dilaksanakan dengan menghasilkan kod baru setiap kali ekspresi dijalankan.

Kata kunci

aritmetik, boolean , perbandingan, ungkapan, perbandingan kabur

Penting: Gunakan arahan lelaki ( % man ) untuk melihat bagaimana arahan digunakan pada komputer tertentu anda.