Príkaz Linux / Unix: expr

názov

expr - Vyhodnotiť výraz

synopse

expr arg ? arg arg ... ?

Zlučuje arg (pridáva medzi sebou medzery medzi oddeľovačmi), vyhodnocuje výsledok ako výraz Tcl a vráti hodnotu. Operátori povolení v Tcl výrazoch sú podmnožinou operátorov povolených v C výrazoch a majú rovnaký význam a prioritu ako zodpovedajúci operátori C. Výrazy takmer vždy prinášajú číselné výsledky (celé čísla alebo hodnoty s pohyblivou rádovou čiarkou). Napríklad výraz

expr 8.2 + 6

hodnotí na 14.2. Výrazy Tcl sa líšia od výrazov C v spôsobe zadávania operandov. Aj výrazy Tcl podporujú nečíselné operandy a porovnávanie reťazcov.

operandmi

Výraz Tcl pozostáva z kombinácie operandov, operátorov a zátvoriek. Môže sa používať biely priestor medzi operandmi a operátormi a zátvorky; ignorujú sa pokyny výrazu. Ak je to možné, operandy sa interpretujú ako celočíselné hodnoty. Celočíselné hodnoty môžu byť zadané v desiatkovej (normálnom prípade), v osmičke (ak je prvý znak operandu 0 ), alebo v šestnástkovej sústave (ak prvé dva znaky operandu sú 0x ). Ak operand nemá jeden z vyššie uvedených celočíselných formátov, ak je to možné, považuje sa za číslo s pohyblivou čiarou. Čísla s pohyblivou čiarou môžu byť špecifikované ľubovoľným spôsobom, akceptovaným kompilátormi kompatibilnými s ANSI (s výnimkou toho, že prípady f , F , l a L nebudú vo väčšine inštalácií povolené). Napríklad všetky nasledujúce sú platné čísla s pohyblivou čiarou: 2.1, 3., 6e4, 7.91e + 16. Ak nie je možná žiadna číselná interpretácia, potom operand zostane ako reťazec (a naň môže byť použitá len obmedzená sada operátorov).

Operandy môžu byť zadané niektorým z nasledujúcich spôsobov:

[1]

Ako číselnú hodnotu, buď celé číslo, alebo pohyblivé miesto.

[2]

Ako premennú Tcl pomocou štandardného zápisu $ . Hodnota premennej sa použije ako operand.

[3]

Ako reťazec uzavretý v dvojitých úvodzovkách. Syntaktický výraz bude vykonávať substitúciu spätného lomítka, premennej a príkazov na informáciách medzi úryvkami a výslednú hodnotu použije ako operand

[4]

Ako retiazka je uzavretá v zátvorkách. Postavy medzi otvorenou rovinou a zodpovedajúcou uzavretou vzperou budú použité ako operand bez akýchkoľvek substitúcií.

[5]

Ako príkaz Tcl uzavretý v zátvorkách. Príkaz sa vykoná a jeho výsledok sa použije ako operand.

[6]

Ako matematická funkcia, ktorej argumenty majú niektorú z vyššie uvedených foriem operandov, ako napríklad hriech ($ x) . Zoznam definovaných funkcií nájdete nižšie.

Ak sa výmeny vyskytujú vyššie (napr. Vo vnútri citovaných reťazcov), sú vykonávané podľa pokynov výrazu. Pred procesorom expresie však mohol už vykonať ďalšiu vrstvu nahradenia analyzátorom príkazov. Ako je uvedené nižšie, zvyčajne je najlepšie zahrnúť výrazy do zátvoriek, aby sa zabránilo tomu, aby analyzátor príkazov vykonal náhrady obsahu.

Pri niektorých príkladoch jednoduchých výrazov predpokladajme, že premenná a má hodnotu 3 a premenná b má hodnotu 6. Potom príkaz na ľavej strane každého z riadkov nižšie vytvorí hodnotu na pravej strane riadka:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * [dĺžka "6 2"] 8 expr {{slovo jedna} <"slovo $ a"} 0

operátori

Platné operátory sú uvedené nižšie, zoskupené v zostupnom poradí:

- + ~!

Unary mínus, unary plus, bit-múdre NOT, logické NOT. Žiadny z týchto operandov nemôže byť použitý na reťazcové operandy a bitové NOT môže byť aplikované len na celé čísla.

* /%

Násobiť, rozdeliť, zvyšok. Žiadny z týchto operandov nemôže byť použitý na reťazcové operandy a zvyšok môže byť použitý iba na celé čísla. Zvyšok bude mať vždy rovnaké znamenie ako deliteľ a absolútnu hodnotu menšiu ako deliteľ.

+ -

Pridať a odčítať. Platí pre akékoľvek číselné operandy.

<< >>

Ľavý a pravý posun. Platí iba pre celé operandy. Pravý posun vždy šíri signálny bit.

<> <=> =

Booleovský menší, väčší, menší alebo rovný a väčší alebo rovný. Každý operátor vytvorí 1, ak je podmienka pravdivá, 0 inak. Tieto operátory môžu byť použité na reťazce, ako aj numerické operandy, v tomto prípade sa používa porovnanie reťazcov.

==! =

Boolean je rovnaký a nie je rovnaký. Každý operátor vytvorí nulový / jeden výsledok. Platí pre všetky typy operandov.

&

Bitové a. Platí iba pre celé operandy.

^

Krátko exkluzívne OR. Platí iba pre celé operandy.

|

Bitové alebo OR. Platí iba pre celé operandy.

&&

Logické AND. Vytvorí 1 výsledok, ak oba operandy sú nenulové, 0 inak. Platí iba pre boolovské a číselné (celé čísla alebo plávajúce body).

||

Logické OR. Vytvorí 0 výsledok, ak oba operandy sú nulové, 1 inak. Platí iba pre boolovské a číselné (celé čísla alebo plávajúce body).

x ? y : z

Ak-potom-inak, rovnako ako v C. Ak x vyhodnotí na nenulovú hodnotu, výsledkom je hodnota y . V opačnom prípade je výsledkom hodnota z . Operand x musí mať číselnú hodnotu.

Viac podrobností o výsledkoch každého operátora nájdete v príručke C. Všetky skupiny binárnych operátorov zostali z rovnakej úrovne prednosti zľava doprava. Napríklad príkaz

expr 4 * 2 <7

vráti 0.

& & , || , a ?: operátori majú "lenivé hodnotenie", rovnako ako v C, čo znamená, že operandy nie sú hodnotené, ak nie sú potrebné na určenie výsledku. Napríklad v príkaze

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

iba jedna z hodnôt [a] alebo [b] bude skutočne vyhodnotená v závislosti od hodnoty $ v . Upozorňujeme však, že to platí iba vtedy, ak je celý výraz uzavretý v zátvorkách; inak analyzátor Tcl vyhodnotí oba [a] a [b] pred vyvolaním príkazu expr .

Matematické funkcie

Tcl podporuje nasledujúce matematické funkcie vo výrazoch:

abs cosh log sqrt akos dvojitý log10 srand asin exp pow tan atan podlaha rand tanh atan2 fmod okrúhly strop hypot sin cos int sinh

abs ( arg )

Vráti absolútnu hodnotu arg . Arg môže byť buď celé číslo alebo floating-point, a výsledok je vrátený v rovnakej forme.

acos ( arg )

Vráti arkozový kosín arg , v rozsahu [0, pi] radiány. Arg má byť v rozmedzí [-1,1].

asin ( arg )

Vráti arkus sinus arg , v rozsahu [-pi / 2, pi / 2] radiány. Arg má byť v rozmedzí [-1,1].

atan ( arg )

Vracia oblúk tangenta arg , v rozsahu [-pi / 2, pi / 2] radiány.

atan2 ( x, y )

Vracia tangenciu oblúka y / x v rozsahu [-pi, pi] radians. x a y nemôžu byť obe.

ceil ( arg )

Vracia najmenšiu celočíselnú hodnotu nie menšiu ako arg .

cos ( arg )

Vráti kosín arg , meraný v radiánoch.

cosh ( arg )

Vráti hyperbolický kosín arg . Ak by výsledok spôsobil pretečenie, vráti sa chyba.

dvojité ( arg )

Ak arg je pohyblivá hodnota, vráti arg , inak prevádza arg na plávajúcu a vráti konvertovanú hodnotu.

exp ( arg )

Vráti exponenciál arg , definovaný ako e ** arg . Ak by výsledok spôsobil pretečenie, vráti sa chyba.

podlaha ( arg )

Vráti najväčšiu integrálnu hodnotu nie väčšiu ako arg .

fmod ( x, y )

Vráti zvyšok plovouceho bodu rozdelenia x o y . Ak y je 0, vráti sa chyba.

hypot ( x, y )

Vypočíta dĺžku hypotenze pravouhlého trojuholníka ( x * x + y * y ).

int ( arg )

Ak arg je celočíselná hodnota, vráti arg , v opačnom prípade konvertuje arg na celé číslo skrátením a vráti konvertovanú hodnotu.

log ( arg )

Vráti prirodzený logaritmus arg . Arg musí byť kladná hodnota.

log10 ( arg )

Vráti logaritmus základne 10 arg . Arg musí byť kladná hodnota.

pow ( x, y )

Vypočíta hodnotu x zvýšenej na hodnotu y . Ak je x záporné, y musí byť celočíselná hodnota.

rand ()

Vráti číslo s pohyblivou čiarou z nuly na menej než jednu alebo z matematického hľadiska rozsah [0,1]. Osivo pochádza z vnútorných hodín prístroja alebo môže byť nastavené manuálne s funkciou Srand.

okrúhly ( arg )

Ak arg je celočíselná hodnota, vráti arg , inak konvertuje arg na celé číslo zaokrúhľovaním a vráti konvertovanú hodnotu.

sin ( arg )

Vráti sínus arg , meraný v radiánoch.

sinh ( arg )

Vráti hyperbolický sinus arg . Ak by výsledok spôsobil pretečenie, vráti sa chyba.

sqrt ( arg )

Vráti druhú odmocninu arg . Arg nesmie byť negatívny.

srand ( arg )

Arg , ktoré musí byť celé číslo, sa používa na resetovanie semien pre generátor náhodných čísel. Vracia prvé náhodné číslo z tohto semena. Každý tlmočník má svoje vlastné osivo.

tan ( arg )

Vracia dotyk arg , meraný v radiánoch.

tanh ( arg )

Vráti hyperbolickú tangenciu arg .

Okrem týchto preddefinovaných funkcií aplikácie môžu definovať ďalšie funkcie pomocou funkcie Tcl_CreateMathFunc ().

Typy, pretečenie a presnosť

Všetky interné výpočty zahŕňajúce celé čísla sa vykonávajú s typom C dlhým a všetky interné výpočty zahŕňajúce pohyblivú čiaru sa vykonávajú s dvojitým typom C. Pri konverzii reťazca na pohyblivú hodinu sa zistí prekryv exponentov a výsledkom je chyba Tcl. Pre konverziu na celé číslo z reťazca, detekcia pretečenia závisí od správania niektorých rutín v miestnej knižnici C, takže by mala byť považovaná za nespoľahlivú. V každom prípade celočíselný prepad a spodný prietok nie sú vo všeobecnosti spoľahlivo detegované, pokiaľ ide o priebežné výsledky. Pretečenie s plovoucím bodom a podtok je detekované do stupňa podporovaného hardvérom, čo je vo všeobecnosti dosť spoľahlivé.

Konverzia medzi internými reprezentáciami pre celočíselné, pohyblivé a reťazcové operandy sa vykoná automaticky podľa potreby. Pri aritmetických výpočtoch sa používajú celé čísla dovtedy, kým nie je zavedené číslo s pohyblivou rádovou čiarkou, po ktorom sa použije plávajúci bod. Napríklad,

expr 5/4

vráti 1, zatiaľ čo

expr 5 / 4.0 expr 5 / ([dĺžka reťazca "abcd"] + 0.0)

obaja vrátia 1,25. Hodnoty s pohyblivou hodnotou sa vždy vrátia s hodnotou `` . 'alebo e tak, aby nevyzerali ako celočíselné hodnoty. Napríklad,

expr 20,0 / 5,0

vráti 4.0 , nie 4 .

Operácie reťazca

Hodnoty reťazca sa môžu použiť ako operandy porovnávacích operátorov, hoci hodnotiteľ výrazu sa pokúša robiť porovnania ako celočíselný alebo pohyblivý bod, keď to môže. Ak je jeden z operandov porovnania reťazec a druhý má číselnú hodnotu, číselný operand sa prevedie späť na reťazec pomocou špecifikátora formátu sprintf C pre celé čísla a % g pre hodnoty s pohyblivou rádovou čiarkou. Napríklad príkazy

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

obaja vrátia 1. Prvé porovnanie sa vykoná pomocou porovnania s celočíselnými hodnotami a druhé je vykonané pomocou porovnávania reťazcov po prevode druhého operandu na reťazec 18 . Vzhľadom na Tclovu tendenciu k liečbe hodnôt ako čísel, kedykoľvek je to možné, nie je všeobecne dobrý nápad používať operátory, ako je == keď naozaj chcete porovnanie reťazcov a hodnoty operandov by mohli byť ľubovoľné; v týchto prípadoch je lepšie použiť namiesto toho reťazec .

Výkonnosť

Priložte výrazy do zátvoriek s najvyššou rýchlosťou a najmenšími požiadavkami na skladovanie. To umožňuje kompilátoru Tcl bytecode generovať najlepší kód.

Ako bolo uvedené vyššie, výrazy sa nahradia dvakrát: raz analyzátorom Tcl a raz príkazom expr . Napríklad príkazy

nastavte 3 nastavenie b {$ a + 2} expr $ b * 4

návrat 11, nie násobok 4. Je to preto, že analyzátor Tcl najprv nahradí $ a + 2 pre premennú b , potom príkaz expr vyhodnotí výraz $ a + 2 * 4 .

Väčšina výrazov nevyžaduje druhé kolo náhrad. Buď sú umiestnené v zátvorkách, alebo ak nie, ich variabilné a príkazové substitúcie prinášajú čísla alebo reťazce, ktoré samy osebe nevyžadujú substitúcie. Pretože niekoľko nevyzretých výrazov potrebuje dve kruhy substitúcií, kompilátor bytecode musí vydať ďalšie pokyny na zvládnutie tejto situácie. Najdrahší kód je potrebný pre nezabezpečené výrazy, ktoré obsahujú príkazy. Tieto výrazy musia byť implementované vytvorením nového kódu pri každom vykonaní výrazu.

Kľúčové slová

aritmetický, booleovský , porovnanie, výraz, fuzzy porovnanie

Dôležité: Pomocou príkazu man ( % man ) môžete zistiť, ako sa príkaz používa vo vašom konkrétnom počítači.