Linux / Unix naredba: expr

Ime

expr - Procijeniti izraz

Sinopsis

expr arg ? arg arg ... ?

Concatenates arg (dodavanje razmaka između njih), procenjuje rezultat kao izraz Tcl i vraća vrednost. Operateri dozvoljeni u Tcl izrazima su podskup operatera dozvoljenih u C izrazima, a imaju isto značenje i prioritet kao odgovarajući C operateri. Izrazi skoro uvek daju numeričke rezultate (vrednosti cijelog ili plutajuće tačke). Na primer, izraz

expr 8.2 + 6

procenjuje na 14.2. Tcl izrazi se razlikuju od C izraza na način na koji su navedeni operandi. Takođe, Tcl izrazi podržavaju ne-numeričke operande i upoređivanja stringova.

Operande

Tcl izraz se sastoji od kombinacije operandi, operatora i zagrada. Bijeli prostor se može koristiti između operanda i operatora i zagrada; ignoriše se uputstva izraza. Gdje je moguće, operandi se tumače kao cijele vrijednosti. Vrednosti cijelog broja mogu biti specificirane u decimalnom (normalnom slučaju), u oktalnom (ako je prvi karakter operanda 0 ) ili hexadecimal (ako su prva dva karaktera operanda 0x ). Ako operand nema jedan od integralnih formata datih gore, onda se tretira kao broj sa plutajućim tačkom ako je to moguće. Brojevi sa plutajućim tačkama mogu biti navedeni na bilo koji način prihvaćen od strane ANSI-kompatibilnog C kompajlera (osim što su f , F , l i L nastavci neće biti dozvoljeni u većini instalacija). Na primjer, svi od sljedećih su važeći brojevi sa plutajućim tačkama: 2.1, 3., 6e4, 7.91e + 16. Ako nijedno numeričko tumačenje nije moguće, operand se ostavlja kao niz (i može se primijeniti samo ograničen skup operatora).

Operandi mogu biti navedeni na bilo koji od sledećih načina:

[1]

Kao numerička vrijednost, cijeli broj ili plutajuća tačka.

[2]

Kao promenljiva Tcl, koristeći standardnu ​​notaciju. Vrednost varijable će se koristiti kao operand.

[3]

Kao niz zatvoren u dvostrukim citatima. Analizator izraza će izvršiti backslash, varijabilne i komandne zamene na informacijama između navodnika i koristiti rezultujuću vrijednost kao operand

[4]

Kao niz u ogradu. Likovi između otvorene naramenice i odgovarajuće blende se koriste kao operand bez ikakvih zamena.

[5]

Kao komanda Tcl zatvorena u zagradama. Komanda će se izvršiti i njen rezultat će se koristiti kao operand.

[6]

Kao matematička funkcija čiji argument ima bilo koju od gornjih formi za operande, kao što je sin ($ x) . Pogledajte dole za listu definisanih funkcija.

Tamo gde se iznova pojavljuju supstitucije (npr. Unutar citiranih nizova), one se obavljaju pomoću izraza. Međutim, dodatni sloj supstitucije je možda već izvršio komandni analizator pre nego što je procesor ekspresije bio pozvan. Kao što je objašnjeno u nastavku, obično je najbolje dodati izraze u zaštitne svrhe kako bi se sprečilo da komandni analizator izvrši zamjene na sadržaju.

Za neke primere jednostavnih izraza, pretpostavimo da promenljiva a ima vrijednost 3, a varijabla b ima vrijednost 6. Tada će komanda sa leve strane svake od linija donijeti vrijednost na desnoj strani linije:

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

Operatori

Valjani operateri su navedeni u nastavku, grupisani u redosledu prioriteta:

- + ~!

Jedinični minus, ujednačen plus, malo bitan, logičan nije. Nijedan od ovih operanda se ne može primijeniti na string operande, a bitno MENI se može primijeniti samo na integers.

* /%

Pomnožite, podelite, ostatak. Nijedan od ovih operanda se ne može primijeniti na string operande, a ostatak može biti primijenjen samo na integers. Ostatak će uvijek imati isti znak kao i delilac i apsolutna vrijednost manja od delitelja.

+ -

Dodajte i oduzmite. Važi za sve numeričke operande.

<< >>

Levo i desno pomeranje. Važeći samo za brojke operande. Desna smjena uvek propagira znak znakova.

<> <=> =

Boole manje, veće, manje ili jednako i veće ili jednake. Svaki operator proizvodi 1 ako je stanje tačno, 0 u suprotnom. Ovi operateri mogu se primijeniti na stringove kao i numeričke operande, u kojem slučaju se koristi niz vrijednosti.

==! =

Boolean jednak i nije jednak. Svaki operater proizvodi rezultat nula / jedan. Važi za sve vrste operanda.

&

Bitno i. Važeći samo za brojke operande.

^

Ekskluzivno ILI. Važeći samo za brojke operande.

|

Bitno m. Važeći samo za brojke operande.

&&

Logički AND. Proizvede 1 rezultat ako su dva operanda nula, 0 u suprotnom. Važeći samo za boolean i numeričke (integers ili floating-point) operande.

||

Logički OR. Proizvede rezultat 0 ako su oba operanda nula, 1 inače. Važeći samo za boolean i numeričke (integers ili floating-point) operande.

x ? y : z

Ako-onda-drugo, kao u C. Ako x procjenjuje na nula, onda je rezultat vrijednost y . Inače, rezultat je vrijednost z . X operand mora imati numeričku vrijednost.

Pogledajte C priručnik za više detalja o rezultatima koje proizvede svaki operator. Svi binarni operateri se nalaze od desne do desne na istom nivou. Na primjer, komanda

expr 4 * 2 <7

vraća 0.

The && , || , i ?: operateri imaju "lenjost", isto kao u C, što znači da se operandi ne procenjuju ako nisu potrebni za određivanje ishoda. Na primjer, u komandi

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

samo jedan od [a] ili [b] će se stvarno procijeniti, ovisno o vrijednosti $ v . Međutim, obratite pažnju na to da je ovo jedino tačno ako je cijeli izraz zatvoren u grudima; u suprotnom, Tcl parser će procijeniti [a] i [b] pre nego što pozove naredbu expr .

Matematičke funkcije

Tcl podržava sledeće matematičke funkcije u izrazima:

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

abs ( arg )

Vraća apsolutnu vrednost arg . Arg može biti ili cela ili plutajuća tačka, a rezultat se vraća u istom obliku.

acos ( arg )

Vraća arc kosinus arg , u opsegu [0, pi] radijana. Arg treba da bude u opsegu [-1,1].

asin ( arg )

Vraća arc sine arg , u opsegu [-pi / 2, pi / 2] radians. Arg treba da bude u opsegu [-1,1].

atan ( arg )

Vraća arc tangent arg , u opsegu [-pi / 2, pi / 2] radianima.

atan2 ( x, y )

Vraća tangentnu tačku y / x , u opsegu [-pi, pi] radians. x i y ne mogu biti oba 0.

ceil ( arg )

Vraća najmanju vrijednost cijele vrijednosti ne manje od arg .

cos ( arg )

Vraća kosinus arguma , meren u radijancima.

cosh ( arg )

Vraća hiperbolični kosinus arg . Ako rezultat dovede do prelivanja, greška se vraća.

dvostruko ( arg )

Ako arg predstavlja plutajuću vrijednost, vraća argument , inače pretvara arg u floating i vraća konvertovanu vrijednost.

exp ( arg )

Vraća eksponencijal arg , definiranog kao e ** arg . Ako rezultat dovede do prelivanja, greška se vraća.

kat ( arg )

Vraća najveću integralnu vrijednost koja nije veća od arg .

fmod ( x, y )

Vraća ostatak plutajuće tačke od podele x za y . Ako je y 0, greška se vraća.

hipot ( x, y )

Izračunava dužinu hipotenuza pravouglog trougla ( x * x + y * y ).

int ( arg )

Ako arg predstavlja cjelovitu vrijednost, vraća argument , inače pretvara arg u cijeli broj putem skraćivanja i vraća konvertovanu vrijednost.

log ( arg )

Vraća prirodni logaritam arg . Arg mora biti pozitivna vrednost.

log10 ( arg )

Vraća bazu 10 logaritma arg . Arg mora biti pozitivna vrednost.

pow ( x, y )

Izračunava vrednost x podignute na snagu y . Ako je x negativan, y mora biti cjelovita vrijednost.

rand ()

Vraća broj sa plutajućim tačkama od nule do samo manje od jednog ili, u matematičkom smislu, opseg [0,1). Seme dolazi iz unutrašnjeg sata mašine ili se može postaviti ručno s srand funkcijom.

okrugli ( arg )

Ako arg predstavlja cjelovitu vrijednost, vraća arg , inače pretvara arg u cijeli broj okrugljem i vraća konvertovanu vrijednost.

sin ( arg )

Vraća sine arg , mjerene u radijancima.

sinh ( arg )

Vraća hiperbolični sine arg . Ako rezultat dovede do prelivanja, greška se vraća.

sqrt ( arg )

Vraća kvadratni korijen arg . Arg mora biti negativan.

srand ( arg )

Arg , koji mora biti ceo broj, koristi se za resetovanje semena za generator slučajnih brojeva. Vraća prvi slučajni broj iz tog semena. Svaki tumač ima svoje seme.

tan ( arg )

Vraća tangenciju arg , mjerenu u radijancima.

tanh ( arg )

Vraća hiperbolični tangent arg .

Pored ovih unapred definisanih funkcija, aplikacije mogu definirati dodatne funkcije koristeći Tcl_CreateMathFunc ().

Vrste, preliv i preciznost

Svi interni obračuni koji se odnose na integers se obavljaju dugačkim C, a svi interni obračuni koji uključuju plutajuće tačke se obavljaju sa dvostrukim tipom C. Prilikom pretvaranja stringa u plutajuću tačku, otkriva se overflow eksponenta i rezultira greškom Tcl. Za pretvaranje u integer iz stringa, detekcija prelivanja zavisi od ponašanja nekih rutina u lokalnoj C biblioteci, tako da bi trebalo smatrati nepouzdanim. U svakom slučaju, cjelobrojni preliv i potop se generalno ne otkrivaju pouzdano za srednje rezultate. Overflow i podvodno plutajuće tačke se detektuju do stepena koji podržava hardver, što je generalno prilično pouzdano.

Konverzija između internih prikaza za integer, floating-point i string operands se vrši automatski po potrebi. Za aritmetička izračunavanja, integriraju se sve dok se ne unese neki broj sa plutajućim tačkama, nakon čega se koristi plutajuća tačka. Na primjer,

expr 5/4

vraća 1, dok

expr 5 / 4.0 expr 5 / ([dužina stringa "abcd"] + 0.0)

obe vrate 1.25. Vrednosti plutajuće tačke se uvek vraćaju sa `` . '' ili e, tako da ne izgledaju kao cjelovite vrijednosti. Na primjer,

expr 20.0 / 5.0

vraća 4.0 , a ne 4 .

String Operations

Vrednosti stringa mogu se koristiti kao operandi operatora usporedbe, iako evaluator izraza pokušava napraviti poređenja kao cijeli broj ili plutajuće tačke kada to može. Ako je jedan od operandi upoređivanja niz, a drugi ima numeričku vrednost, numerički operand se pretvara u niz pomoću specifikata formata sprintf formata % d za integers i % g za vrijednosti sa floating point. Na primjer, komande

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

oboje se vraćaju 1. Prvo poređenje se vrši pomoću upoređivanja cijelog broja, a druga se vrši pomoću upoređivanja nizova nakon što se drugi konvertor pretvori u niz 18 . Zbog tendencije Tcl-a da tretira vrijednosti kao brojeve kad god je to moguće, nije uopšte dobra ideja da koristite operatere poput == kada zaista želite niz upoređivanja i vrijednosti operandi mogu biti proizvoljne; bolje je da u ovim slučajevima umesto toga koristite komandu string .

Razmatranja performansi

Dodajte izraze u obliku za najbolju brzinu i najmanje zahteve za skladištenjem. Ovo omogućava Tcl bytecode kompajleru da generiše najbolji kod.

Kao što je već pomenuto, izrazi se zamenjuju dva puta: jedanput pomoću Tcl parsera i jednom komandom expr . Na primjer, komande

podesite 3 skupa b {$ a + 2} expr $ b * 4

vraćanje 11, a ne višestruko 4. Ovo je zato što će tcl parser prvo zamijeniti $ a + 2 za varijablu b , onda će izraz expr izračunati izraz $ a + 2 * 4 .

Većini izraza ne zahtevaju drugi krug zamjena. Ili su zatvoreni u grudima ili, ako ne, njihove varijabilne i komandne supstitucije donose brojeve ili stringove koji sami ne zahtevaju zamjene. Međutim, pošto je za nekoliko neobrabljenih izraza potrebno dva kruga zamjena, bytecode kompajler mora emitirati dodatne instrukcije za rješavanje ove situacije. Najskuplji kôd je potreban za neobrađene izraze koji sadrže komandne zamene. Ovi izrazi moraju biti implementirani stvaranjem novog koda svaki put kada se izraz izvrši.

Ključne riječi

aritmetička, logična , uporedna, ekspresivna, fazi srazmera

Važno: Koristite komandu čovjeka ( % čovjek ) da biste videli kako se na vašem računaru koristi komanda.