Linux / Perintah Unix: expr

Nama

expr - Mengevaluasi ekspresi

Ringkasan

expr arg ? arg arg ... ?

Concatenates arg 's (menambahkan ruang pemisah di antara mereka), mengevaluasi hasilnya sebagai ekspresi Tcl, dan mengembalikan nilai. Operator diizinkan dalam ekspresi Tcl adalah bagian dari operator diizinkan dalam ekspresi C, dan mereka memiliki arti yang sama dan diutamakan sebagai operator C yang sesuai. Ekspresi hampir selalu menghasilkan hasil numerik (nilai integer atau floating-point). Misalnya, ekspresi

expr 8.2 + 6

mengevaluasi ke 14.2. Ekspresi Tcl berbeda dari ekspresi C dalam cara operan ditentukan. Juga, ekspresi Tcl mendukung operan non-numerik dan perbandingan string.

Operan

Ekspresi Tcl terdiri dari kombinasi operand, operator, dan tanda kurung. Ruang putih dapat digunakan antara operand dan operator dan tanda kurung; itu diabaikan oleh instruksi ungkapan itu. Jika memungkinkan, operan ditafsirkan sebagai nilai integer. Nilai integer dapat ditentukan dalam desimal (kasus normal), dalam oktal (jika karakter pertama operand adalah 0 ), atau dalam heksadesimal (jika dua karakter pertama operand adalah 0x ). Jika operan tidak memiliki salah satu format bilangan bulat yang diberikan di atas, maka ia diperlakukan sebagai bilangan floating-point jika itu mungkin. Nomor floating-point dapat ditentukan dengan cara apapun yang diterima oleh compiler C compiler ANSI (kecuali bahwa f , F , l , dan akhiran L tidak akan diizinkan di sebagian besar instalasi). Misalnya, semua yang berikut adalah angka floating-point yang valid: 2.1, 3., 6e4, 7.91e + 16. Jika tidak ada interpretasi numerik yang mungkin, maka operand dibiarkan sebagai string (dan hanya satu set operator terbatas yang dapat diterapkan).

Operan dapat ditentukan dengan salah satu cara berikut:

[1]

Sebagai nilai numerik, baik integer atau floating-point.

[2]

Sebagai variabel Tcl, menggunakan notasi $ standar. Nilai variabel akan digunakan sebagai operan.

[3]

Sebagai string tertutup dalam tanda kutip ganda. Pengurai ekspresi akan melakukan backslash, variabel, dan penggantian perintah pada informasi di antara tanda kutip, dan menggunakan nilai yang dihasilkan sebagai operand

[4]

Sebagai tali tertutup di kawat gigi. Karakter antara kurung buka dan penjepit dekat yang cocok akan digunakan sebagai operand tanpa substitusi apa pun.

[5]

Sebagai perintah Tcl tertutup dalam tanda kurung. Perintah akan dieksekusi dan hasilnya akan digunakan sebagai operan.

[6]

Sebagai fungsi matematika yang argumennya memiliki salah satu dari bentuk di atas untuk operand, seperti sin ($ x) . Lihat di bawah untuk daftar fungsi yang ditentukan.

Di mana substitusi terjadi di atas (misalnya di dalam string kutipan), mereka dilakukan oleh instruksi ekspresi. Namun, lapisan substitusi tambahan mungkin sudah dilakukan oleh parser perintah sebelum prosesor ekspresi dipanggil. Sebagaimana dibahas di bawah ini, biasanya paling baik untuk menyertakan ekspresi dalam tanda kurung untuk mencegah parser perintah melakukan substitusi pada konten.

Untuk beberapa contoh ekspresi sederhana, anggaplah variabel a memiliki nilai 3 dan variabel b memiliki nilai 6. Kemudian perintah di sisi kiri masing-masing garis di bawah ini akan menghasilkan nilai di sisi kanan baris:

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

Operator

Operator yang valid tercantum di bawah ini, dikelompokkan dalam urutan menurun prioritas:

- + ~!

Unary minus, unary plus, bit-wise NOT, logical NOT. Tak satu pun dari operan ini dapat diterapkan ke operan string, dan bit-wise NOT mungkin hanya diterapkan ke bilangan bulat.

* /%

Gandakan, bagi, sisanya. Tak satu pun dari operan ini dapat diterapkan ke operan string, dan sisanya dapat diterapkan hanya untuk bilangan bulat. Sisanya akan selalu memiliki tanda yang sama dengan pembagi dan nilai absolut yang lebih kecil dari pembagi.

+ -

Tambah dan kurangi. Berlaku untuk setiap operan numerik.

<< >>

Pergeseran kiri dan kanan. Berlaku hanya untuk operan bilangan bulat. Pergeseran kanan selalu menyebarkan sedikit tanda.

<> <=> =

Boolean kurang, lebih besar, kurang dari atau sama, dan lebih besar dari atau sama. Setiap operator menghasilkan 1 jika kondisinya benar, 0 sebaliknya. Operator ini dapat diterapkan ke string serta operan numerik, di mana perbandingan string kasus digunakan.

==! =

Boolean sama dan tidak sama. Setiap operator menghasilkan hasil nol / satu. Berlaku untuk semua jenis operan.

&

Bit-wise AND. Berlaku hanya untuk operan bilangan bulat.

^

ATAU ORANG BAIK. Berlaku hanya untuk operan bilangan bulat.

|

Bijak ATAU. Berlaku hanya untuk operan bilangan bulat.

&&

Logis DAN. Menghasilkan hasil 1 jika kedua operan tidak nol, 0 sebaliknya. Berlaku hanya untuk operand boolean dan numerik (integer atau floating-point) saja.

||

Logika OR. Menghasilkan hasil 0 jika kedua operand adalah nol, 1 sebaliknya. Berlaku hanya untuk operand boolean dan numerik (integer atau floating-point) saja.

x ? y : z

Jika-maka-lain, seperti dalam C. Jika x bernilai nol, maka hasilnya adalah nilai y . Jika tidak, hasilnya adalah nilai z . Operan x harus memiliki nilai numerik.

Lihat manual C untuk rincian lebih lanjut tentang hasil yang dihasilkan oleh masing-masing operator. Semua grup operator biner kiri-ke-kanan dalam tingkat prioritas yang sama. Misalnya, perintah

expr 4 * 2 <7

mengembalikan 0.

The && , || , dan ?: operator memiliki `` evaluasi malas '', sama seperti di C, yang berarti operan tidak dievaluasi jika mereka tidak diperlukan untuk menentukan hasilnya. Misalnya, dalam perintah

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

hanya satu dari [a] atau [b] yang benar-benar akan dievaluasi, tergantung pada nilai $ v . Perhatikan, bagaimanapun, bahwa ini hanya benar jika seluruh ekspresi tertutup dalam tanda kurung; jika tidak, parser Tcl akan mengevaluasi [a] dan [b] sebelum menjalankan perintah expr .

Fungsi Matematika

Tcl mendukung fungsi matematika berikut dalam ekspresi:

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

abs ( arg )

Mengembalikan nilai absolut dari arg . Arg bisa berupa integer atau floating-point, dan hasilnya dikembalikan dalam bentuk yang sama.

acos ( arg )

Mengembalikan cosinus busur dari arg , dalam rentang [0, pi] radian. Arg harus berada dalam kisaran [-1,1].

asin ( arg )

Mengembalikan sinus busur dari arg , dalam rentang [-pi / 2, pi / 2] radian. Arg harus berada dalam kisaran [-1,1].

atan ( arg )

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

atan2 ( x, y )

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

ceil ( arg )

Mengembalikan nilai integer terkecil tidak kurang dari arg .

cos ( arg )

Mengembalikan kosinus arg , diukur dalam radian.

cosh ( arg )

Mengembalikan kosinus hiperbolik dari arg . Jika hasilnya akan menyebabkan overflow, kesalahan akan dikembalikan.

ganda ( arg )

Jika arg adalah nilai yang mengambang, gulung arg , jika tidak mengubah arg menjadi mengambang dan mengembalikan nilai yang dikonversi.

exp ( arg )

Mengembalikan eksponensial arg , yang didefinisikan sebagai e ** arg . Jika hasilnya akan menyebabkan overflow, kesalahan akan dikembalikan.

lantai ( arg )

Mengembalikan nilai integral terbesar yang tidak lebih besar dari arg .

fmod ( x, y )

Mengembalikan sisa floating-point dari pembagian x oleh y . Jika y adalah 0, kesalahan dikembalikan.

hipot ( x, y )

Menghitung panjang sisi miring dari segitiga siku-siku ( x * x + y * y ).

int ( arg )

Jika arg adalah nilai integer, return arg , jika tidak mengkonversi arg ke integer dengan memotong dan mengembalikan nilai yang dikonversi.

log ( arg )

Mengembalikan logaritma natural arg . Arg harus menjadi nilai positif.

log10 ( arg )

Mengembalikan logaritma basis 10 dari arg . Arg harus menjadi nilai positif.

pow ( x, y )

Menghitung nilai x yang dinaikkan ke daya y . Jika x negatif, y harus berupa nilai bilangan bulat.

rand ()

Mengembalikan angka floating point dari nol ke hanya kurang dari satu atau, dalam istilah matematika, kisaran [0,1). Benih berasal dari jam internal mesin atau dapat diatur secara manual dengan fungsi induk.

bulat ( arg )

Jika arg adalah nilai integer, return arg , jika tidak mengkonversi arg ke integer dengan membulatkan dan mengembalikan nilai yang dikonversi.

sin ( arg )

Mengembalikan sinus arg , diukur dalam radian.

sinh ( arg )

Mengembalikan sinus hiperbolik arg . Jika hasilnya akan menyebabkan overflow, kesalahan akan dikembalikan.

sqrt ( arg )

Mengembalikan akar kuadrat dari arg . Arg harus tidak negatif.

srand ( arg )

Arg , yang harus berupa bilangan bulat, digunakan untuk mereset benih untuk pembuat nomor acak. Mengembalikan nomor acak pertama dari benih itu. Setiap penerjemah memiliki benihnya sendiri.

tan ( arg )

Mengembalikan singgung arg , diukur dalam radian.

tanh ( arg )

Mengembalikan tangen hiperbolik dari arg .

Selain fungsi yang telah ditentukan ini, aplikasi dapat menentukan fungsi tambahan menggunakan Tcl_CreateMathFunc ().

Jenis, Melimpah, dan Presisi

Semua perhitungan internal melibatkan bilangan bulat dilakukan dengan tipe C panjang , dan semua perhitungan internal yang melibatkan floating-point dilakukan dengan tipe C ganda . Ketika mengkonversi string ke floating-point, eksponen eksponen terdeteksi dan menghasilkan kesalahan Tcl. Untuk konversi ke integer dari string, deteksi overflow tergantung pada perilaku beberapa rutinitas di perpustakaan C lokal, sehingga harus dianggap tidak dapat diandalkan. Dalam kasus apapun, overflow integer dan underflow umumnya tidak terdeteksi secara andal untuk hasil antara. Floating-point overflow dan underflow terdeteksi pada tingkat yang didukung oleh perangkat keras, yang umumnya cukup dapat diandalkan.

Konversi antara representasi internal untuk integer, floating-point, dan operan string dilakukan secara otomatis sesuai kebutuhan. Untuk perhitungan aritmatika, bilangan bulat digunakan sampai beberapa nomor floating-point diperkenalkan, setelah itu floating-point digunakan. Sebagai contoh,

expr 5/4

mengembalikan 1, sementara

expr 5 / 4.0 expr 5 / ([string length "abcd"] + 0,0)

keduanya mengembalikan 1,25. Nilai floating-point selalu dikembalikan dengan `` . '' atau e sehingga mereka tidak akan terlihat seperti nilai integer. Sebagai contoh,

Expr 20.0 / 5.0

mengembalikan 4.0 , bukan 4 .

Operasi String

Nilai string dapat digunakan sebagai operand dari operator perbandingan, meskipun evaluator ekspresi mencoba melakukan perbandingan sebagai integer atau floating-point ketika itu bisa. Jika salah satu operand dari perbandingan adalah string dan yang lain memiliki nilai numerik, operan numerik diubah kembali ke string menggunakan format C spidf %% untuk bilangan bulat dan % g untuk nilai-nilai floating-point. Misalnya, perintah

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

keduanya kembali 1. Perbandingan pertama dilakukan dengan menggunakan perbandingan bilangan bulat, dan yang kedua dilakukan dengan menggunakan perbandingan string setelah operan kedua dikonversi ke string 18 . Karena kecenderungan Tcl untuk memperlakukan nilai-nilai sebagai angka jika memungkinkan, bukanlah ide yang bagus untuk menggunakan operator seperti == ketika Anda benar-benar menginginkan perbandingan string dan nilai-nilai dari operand bisa sewenang-wenang; lebih baik dalam hal ini untuk menggunakan perintah string sebagai gantinya.

Pertimbangan Kinerja

Sertakan ekspresi dalam kawat gigi untuk kecepatan terbaik dan persyaratan penyimpanan terkecil. Ini memungkinkan compiler bytecode Tcl untuk menghasilkan kode terbaik.

Seperti disebutkan di atas, ekspresi diganti dua kali: sekali oleh parser Tcl dan satu kali oleh perintah expr . Misalnya, perintah

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

return 11, bukan kelipatan 4. Ini karena Tcl parser pertama-tama akan mengganti $ a + 2 untuk variabel b , maka perintah expr akan mengevaluasi ekspresi $ a + 2 * 4 .

Sebagian besar ekspresi tidak memerlukan penggantian babak kedua. Entah mereka tertutup dalam kurung atau, jika tidak, variabel dan pergantian perintah mereka menghasilkan angka atau string yang tidak sendiri membutuhkan pergantian. Namun, karena beberapa ekspresi yang tidak terkendali membutuhkan dua putaran substitusi, compiler bytecode harus mengeluarkan instruksi tambahan untuk menangani situasi ini. Kode paling mahal diperlukan untuk ekspresi yang tidak dikungkung yang mengandung substitusi perintah. Ekspresi ini harus diimplementasikan dengan menghasilkan kode baru setiap kali ekspresi dieksekusi.

Kata kunci

aritmatika, boolean , bandingkan, ekspresi, perbandingan fuzzy

Penting: Gunakan perintah man ( % man ) untuk melihat bagaimana perintah digunakan pada komputer khusus Anda.