Linux / Unix naredba: expr

Ime

expr - Ocijenite izraz

Sinopsis

expr arg ? arg arg ... ?

Združuje arg (dodavanje razmaka razdjelnika između njih), procjenjuje rezultat kao izraz Tcl i vraća vrijednost. Operatori dozvoljeni u Tcl izrazima su podskup operatora koji su dopušteni u C izrazima i imaju isto značenje i prioritet kao i odgovarajući operatori C. Izrazi gotovo uvijek donose brojčane rezultate (vrijednosti cijele ili plutajuće točke). Na primjer, izraz

expr 8,2 + 6

procjenjuje na 14.2. Tcl izrazi razlikuju se od C izraza na način na koji su navedeni operandi. Također, Tcl izrazi podržavaju ne-numeričke operande i usporedbe nizova.

operanda

Tcl izraz sastoji se od kombinacije operandi, operatora i zagrada. Bijeli se prostor može koristiti između operanda i operatora i zagrada; zanemaruje se uputama izražavanja. Tamo gdje je moguće, operandi se tumače kao cjelobrojne vrijednosti. Vrijednosti cijelih vrijednosti mogu biti specificirane u decimalnom (normalnom slučaju), u oktalnom (ako je prvi znak operanda 0 ) ili u heksadecimalnom (ako su prva dva znaka operanda 0x ). Ako operand nema jedan od gore navedenih formata cijelog broja, to se tretira kao broj s pomičnim zarezom, ako je to moguće. Brojevi s pomičnim zarezima mogu se navesti na bilo koji način prihvaćen od ANSI kompatibilnog C prevoditelja (osim što sufiks f , F , L i L neće biti dopušten u većini instalacija). Na primjer, sve od sljedećeg su važeći brojevi s pomičnim zarezima: 2.1, 3., 6e4, 7.91e + 16. Ako nije moguće numeričko tumačenje, operand ostaje kao niz (i na njega se može primijeniti samo ograničeni skup operatora).

Operandi se mogu navesti na jedan od sljedećih načina:

[1]

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

[2]

Kao Tcl varijabla, koristeći standardno $ notacija. Vrijednost varijable bit će upotrijebljena kao operand.

[3]

Kao niz zatvoren u dvostrukim navodnicima. Izraz parser izvodi obrnute, promjenjive i zamjenske naredbe na informacijama između navodnika, a rezultirajuću vrijednost koristi kao operand

[4]

Kao nosač zatvoren u braces. Likovi između otvorenog zaglavlja i podudarnog bloka za zatvaranje upotrijebit će se kao operand bez ikakvih zamjena.

[5]

Kao naredba Tcl zatvorena u zagradama. Naredba će biti izvršena i rezultat će se koristiti kao operand.

[6]

Kao matematička funkcija čiji argumenti imaju bilo koji od gore navedenih oblika operandi, kao što je grijeh ($ x) . Pogledajte dolje za popis definiranih funkcija.

Gdje nastaju supstitucije (npr. Unutar citirane žice), oni se izvode pomoću izraza. No, naredbeni parser već je izvršio dodatni sloj zamjene prije no što se nazvao procesor za ekspresiju. Kao što je objašnjeno u nastavku, obično je najbolje priložiti izraze u zagradama kako bi spriječili zapovjednog parsera izvršavanje zamjena na sadržaju.

Za neke primjere jednostavnih izraza, pretpostavimo da varijabla a ima vrijednost 3, a varijab ima vrijednost 6. Zatim naredba na lijevoj strani svakog od redaka ispod donosi vrijednost na desnoj strani crte:

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

operatori

Dolje su navedeni važeći operatori, grupirani u redoslijedu redoslijeda:

- + ~!

Unary minus, unary plus, bit-wise NE, logičan NOT. Nijedan od tih operandi ne može se primijeniti na niz operanda, a bitno ne može se primijeniti samo na cijele brojeve.

* /%

Pomnožite, podijelite, ostatak. Nijedan od tih operandi ne može se primijeniti na niz operanda, a ostatak se može primijeniti samo na cijele brojeve. Ostatak će uvijek imati isti znak kao i djelitelj i apsolutnu vrijednost manju od dijelitelja.

+ -

Dodavanje i oduzimanje. Vrijedi za sve numeričke operande.

<< >>

Lijeva i desna pomak. Vrijedi samo za cijele operande. Pravo pomicanje uvijek propagira bit znaka.

<> <=> =

Boolean manje, veće, manje ili jednako, i veće ili jednako. Svaki operator proizvodi 1 ako je uvjet istinit, 0 inače. Ovi operatori mogu se primijeniti na žice kao i numeričke operande, u kojem slučaju se upotrebljava usporedba niza.

==! =

Boolean jednak i nije jednak. Svaki operator proizvodi rezultat nula / jedan. Vrijedi za sve vrste operanda.

&

Bitno i AND. Vrijedi samo za cijele operande.

^

Bit-mudar ekskluzivni OR. Vrijedi samo za cijele operande.

|

Bitno, ILI. Vrijedi samo za cijele operande.

&&

Logička i. Dobiva jedan rezultat ako oba operanda nisu nula, inače 0. Vrijedi samo za booleove i numeričke (integers ili floating-point) operande.

||

Logička OR. Dobiva rezultat 0 ako su oba operanda nula, a druga inače. Vrijedi samo za booleove i numeričke (integers ili floating-point) operande.

x ? y : z

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

Pogledajte priručnik C za više detalja o rezultatima koje proizvodi svaki operator. Sve skupine binarnih operatora slijeva-desno unutar iste razine prednosti. Na primjer, naredba

expr 4 * 2 <7

vraća 0.

&& , || , i ?: operatori imaju "lijenu procjenu", baš kao u C, što znači da se operandi ne ocjenjuju ako nisu potrebni za određivanje ishoda. Na primjer, u naredbi

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

samo će jedan od [a] ili [b] biti vrednovan, ovisno o vrijednosti od $ v . Napominjemo, međutim, da je to istina samo ako je cijeli izraz zatvoren u zagradama; inače, Tcl parser će procijeniti i [a] i [b] prije nego što se zove expr naredba.

Math funkcije

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

apsolutna logika zapisnika sqrt acos dvostruko log10 srand asin exp pow tan atan kat trka tanh atan2 fmod okrugli preklop hypot sin cos int sinh

abs ( arg )

Vraća apsolutnu vrijednost arg . Arg može biti cijeli broj ili plutajuća točka, a rezultat se vraća u istom obliku.

acos ( arg )

Vraća luk kosinus arg , u rasponu [0, pi] radijanima. Arg treba biti u rasponu [-1,1].

asin ( arg )

Vraća luk sine arg , u rasponu [-pi / 2, pi / 2] radijanima. Arg treba biti u rasponu [-1,1].

atan ( arg )

Vraća luka tangenta arg , u rasponu [-pi / 2, pi / 2] radijanima.

atan2 ( x, y )

Vraća luka tangenta y / x , u području [-pi, pi] radijanima. x i y ne mogu oboje biti 0.

gornja granica ( arg )

Vraća najmanju cjelobrojnu vrijednost ne manje od arg .

cos ( arg )

Vraća kosinus arg , mjeren u radijanima.

cosh ( arg )

Vraća hiperbolni kosinus arg . Ako rezultat uzrokuje prelijevanje, pogreška se vraća.

dvostruko ( arg )

Ako je arg je plutajuća vrijednost, vraća arg , inače pretvara arg na plutajuće i vraća pretvorenu vrijednost.

exp ( arg )

Vraća eksponencijalni argument arg , definiran kao e ** arg . Ako rezultat uzrokuje prelijevanje, pogreška se vraća.

kat ( arg )

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

fmod ( x, y )

Vraća preostali dio podijeljenosti x s y . Ako je y 0, vraća se pogreška.

hipoteza ( x, y )

Izračunava duljinu hipotenzije pravokutnog trokuta ( x * x + y * y ).

int ( arg )

Ako je arg je cijela vrijednost, vraća arg , inače pretvara arg na cijeli broj skraćivanjem i vraća pretvorenu vrijednost.

log ( arg )

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

log10 ( arg )

Vraća osnovni logaritam arg . Arg mora biti pozitivna vrijednost.

pow ( x, y )

Izračunava vrijednost x podignutog na snagu y . Ako je x negativan, y mora biti cijela vrijednost.

Rand ()

Vraća broj s pomičnim zarezom od nula do samo manje od jednog ili, u matematičkim izrazima, raspon [0,1]. Sjeme dolazi iz unutarnjeg sata stroja ili se može postaviti ručno s funkcijom srand.

okrugli ( arg )

Ako je arg je cijela vrijednost, vraća arg , inače pretvara arg do cjelobrojnog zaokruživanja i vraća pretvorenu vrijednost.

grijeh ( arg )

Vraća sinus arg , mjeren u radijanima.

sinh ( arg )

Vraća hiperboličnu sinus arg . Ako rezultat uzrokuje prelijevanje, pogreška se vraća.

sqrt ( arg )

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

srand ( arg )

Arg , koji mora biti cijeli broj, koristi se za resetiranje sjemena generatora slučajnih brojeva. Vraća prvi slučajan broj iz tog sjemena. Svaki tumač ima svoje sjeme.

tan ( arg )

Vraća tangent arg , mjeren u radijanima.

tanh ( arg )

Vraća hiperbolnu tangent arg .

Pored ovih unaprijed definiranih funkcija, aplikacije mogu definirati dodatne funkcije pomoću Tcl_CreateMathFunc ().

Vrste, preljev i preciznost

Sva interna računanja koja obuhvaćaju cijele brojeve obavlja se s tipom C dugom , a sva unutarnja računanja koja uključuju plutajuće točke obavlja se dvostrukim tipom C. Prilikom pretvaranja niza u plutajuću točku otkriva eksponentni preljev i rezultira pogreškom Tcl. Za pretvorbu u cijeli broj iz niza, otkrivanje prelijevanja ovisi o ponašanju nekih rutina u lokalnoj C biblioteci pa je potrebno smatrati nepouzdanim. U svakom slučaju, cjelobrojni preljev i potopljenje općenito se ne pouzdano otkrivaju za srednje rezultate. Preplavljivanje i potopljenje s pomičnim točkama otkrivaju se do stupnja koji podržava hardver, što je općenito prilično pouzdano.

Konverzija između internih reprezentacija za cijeli, floating-point i string operands automatski se obavlja prema potrebi. Za aritmetička računanja, cijeli brojevi se koriste sve dok se ne uvodi neki broj s pomičnim zarezom, nakon čega se koristi plutajuća točka. Na primjer,

expr 5/4

vraća 1, dok

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

oba vraćaju 1,25. Vrijednosti pomične točke uvijek se vraćaju s `` . '' ili e tako da neće izgledati kao cijele vrijednosti. Na primjer,

expr 20.0 / 5.0

vraća 4,0 , a ne 4 .

String operacije

String vrijednosti mogu se koristiti kao operandi operatera usporedbe, iako procjena efekta pokušava napraviti usporedbe kao cijeli broj ili plutajuće točke kada to može. Ako je jedan od operandi usporedbe niz, a drugi ima numeričku vrijednost, numerički operand se pretvara natrag u niz pomoću C sprintf formata specifiera % d za cijele brojeve i % g za vrijednosti s pomičnim zarezom. Na primjer, naredbe

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

oba se vraćaju 1. Prva se usporedba vrši pomoću usporedbe cijelih brojeva, a druga se vrši koristeći usporedbu niza nakon što se drugi operand pretvori u niz 18 . Zbog Tclove sklonosti prema vrijednosti kao brojeva kad god je to moguće, obično nije dobra ideja koristiti operatore poput == kada stvarno želite usporediti niz i vrijednosti operandi mogu biti proizvoljne; u tim je slučajevima bolje koristiti naredbu za naredbu.

Razmatranja izvedbe

Uključite izraze u braces za najbolju brzinu i najmanji zahtjevi za pohranu. To omogućuje Tcl bajtkod prevodilac za generiranje najboljeg koda.

Kao što je gore spomenuto, izrazi su zamijenjeni dvaput: jednom od Tcl parser i jednom od naredbe expr . Na primjer, naredbe

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

povratak 11, a ne više od 4. To je zato što će Tcl parser najprije zamijeniti $ a + 2 za varijablu b , a zatim će naredba exprl procjenjivati ​​izraz $ a + 2 * 4 .

Većina izraza ne zahtijeva drugi krug zamjena. Ili su zatvoreni u braces, ili, ako ne, njihove varijable i naredbe zamjene donose brojeve ili nizove koji sami ne zahtijevaju zamjene. Međutim, budući da nekoliko neobrađenih izraza zahtijeva dva kruga zamjena, alat za kompajliranje bajtova mora emitirati dodatne upute za rješavanje ove situacije. Najskuplji kod potreban je za neobrađene izraze koji sadrže zamjene naredbi. Ovi se izrazi moraju provesti generiranjem novog koda svaki put kada se izraz obavlja.

ključne riječi

aritmetički, boolean , usporediti, izražavanje, fuzzy usporedbu

Važno: Upotrijebite naredbu čovjek ( % man ) kako biste vidjeli kako se naredba koristi na vašem računalu.