Ime
expr - Ocijenite izraz
Sinopsis
Expr arg ? arg arg … ?
Spaja 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 cjelobrojnih vrijednosti mogu se navesti u decimalnom (normalnom slučaju), u oktalnom (ako je prvi znak operanda0), ili u heksadecimalnom (ako su prva dva znaka operanda0x). 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 jef, F, l, iL sufiks 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 standard$ 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 gornjih oblika operandi, kao što jegrijeh ($ x), Pogledajte dolje za popis definiranih funkcija.
Gore u slučaju supstitucija (npr. Unutar navodnih nizova) izvršavaju se pomoću izraza ekspresije. 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 varijablu ima vrijednost 3 i varijablubima vrijednost 6. Tada će naredba na lijevoj strani svakog od redaka ispod donijeti vrijednost na desnoj strani linije:
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, a rezultat je vrijednost od y , Inače, rezultat je vrijednost od 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 evaluaciju", baš kao u C, što znači da se operandi ne procjenjuju ako nisu potrebni za određivanje ishoda. Na primjer, u naredbi
expr {$ v? a: b}
samo jedan odA iliB će se zapravo vrednovati, ovisno o vrijednosti$ v, Napominjemo, međutim, da je to istina samo ako je cijeli izraz zatvoren u zagradama; inače, Tcl parser će procijeniti obojeA iB prije nego što se zazivaExpr naredba.
Math funkcije
Tcl podržava sljedeće matematičke funkcije u izrazima:
aBS blackjackkladasqrt acos dvostrukolog10srand Asin expPowpreplanulost atan kativicaTANH ATAN2 fmodkrug staviti strop hypotgrijeh cos intsinh
ABS ( arg )
Vraća apsolutnu vrijednost od 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 od arg , u rasponu 0, pi radijanima. Arg treba biti u rasponu -1,1.
Asin ( arg )
Vraća lijes sine od arg , u rasponu -pi / 2, pi / 2 radijanima. Arg treba biti u rasponu -1,1.
atan ( arg )
Vraća luka tangenta od arg , u rasponu -pi / 2, pi / 2 radijanima.
ATAN2 ( x, y )
Vraća luka tangenta od y / x , u rasponu -pi, pi radijanima. x i y obje ne mogu biti 0.
staviti strop( arg )
Vraća najmanju cjelobrojnu vrijednost ne manju od arg .
cos ( arg )
Vraća kosinus od arg , mjereno u radijanima.
blackjack ( arg )
Vraća hiperbolni kosinus arg , Ako rezultat uzrokuje prelijevanje, pogreška se vraća.
dvostruko( arg )
Ako arg je plutajuća vrijednost, vraća se arg , inače se pretvara arg da pluta i vraća pretvorenu vrijednost.
exp ( arg )
Vraća eksponencijalno 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 u pomičnim zarezima x po y , Ako y je 0, pogreška se vraća.
hypot ( x, y )
Izračunava duljinu hipotenzije pravokutnog trokuta ( x * x + y * y ).
int ( arg )
Ako arg je cijela vrijednost, vraća se arg , inače se 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 10 arg . Arg mora biti pozitivna vrijednost.
Pow ( x, y )
Izračunava vrijednost x podignut na moć y , Ako x je 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.
krug( arg )
Ako arg je cijela vrijednost, vraća se arg , inače se pretvara arg do cijelog broja zaokruživanjem i vraća pretvorenu vrijednost.
grijeh( arg )
Vraća sine od arg , mjereno u radijanima.
sinh ( arg )
Vraća hiperbolski sinus arg , Ako rezultat uzrokuje prelijevanje, pogreška se vraća.
sqrt ( arg )
Vraća kvadratni korijen od 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 tangens arg , mjereno u radijanima.
TANH ( arg )
Vraća hiperboličku tangentu arg .
Pored ovih unaprijed definiranih funkcija, aplikacije mogu definirati dodatne funkcije pomoćuTcl_CreateMathFunc().
Vrste, preljev i preciznost
Sva interna računanja koja uključuju cijele brojeve obavlja se s tipom C dugo , a sva unutarnja računanja s plutajućom točkom vrše se s tipom C dvostruko , 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ća4.0, ne4.
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 u niz pomoću C sprintf specifičar formata% d za integers i% g za vrijednosti s pomičnim zarezom. Na primjer, naredbe
expr {"0x03"> "2"} expr {"0y" <"0x12"}
oba vraćaju 1. Prva usporedba se vrši pomoću usporedbe cijelih brojeva, a druga se vrši koristeći nizovsku usporedbu nakon što se drugi operand pretvori u niz18, Zbog Tclove sklonosti prema vrijednosti kao brojeva kad god je to moguće, općenito nije dobra ideja koristiti operatere kao što je==kada zaista želite usporedbu niza i vrijednosti operandi mogu biti proizvoljne; u ovim je slučajevima bolje koristitiniz umjesto toga.
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 strane Expr naredba. Na primjer, naredbe
postavite 3 postavite b {$ a + 2} expr $ b * 4
povrat 11, a ne više od 4. To je zato što Tcl parser će prvo zamijeniti$ a + 2 za varijablub, ondaExpr naredba će procijeniti 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: Koristiti čovjek naredba ( % čovjek ) kako biste vidjeli kako se naredba koristi na vašem računalu.