Skip to main content

Všetko o príkazu Linux / Unix: expr

Anonim

názov

expr - Vyhodnotiť výraz

synopse

expr arg ? arg arg … ?

zřetězuje arg (pridaním medzery medzi nimi) vyhodnotí 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álnej), v osmičke (ak je prvý znak operandu0) alebo hexadecimálne (ak sú prvé dva znaky operandu0x). 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 C (s výnimkou toho, žeF, F, l, aL prípony nebudú vo väčšine zariadení 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$ notácie. 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 naprsin ($ x), Zoznam definovaných funkcií nájdete nižšie.

Ak sa výmeny vyskytujú vyššie (napríklad vo vnútri citovaných reťazcov), vykonávajú sa 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 predpokladajte premennú má hodnotu 3 a premennúbmá 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-iný, ako v C. Ak X vyhodnotí na nenulovú hodnotu, výsledkom je hodnota y , V opačnom prípade je výsledkom hodnota z , X operand 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 jeden z nichA aleboB bude v skutočnosti 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í obeA aB pred vyvolanímexpr Príkaz.

Matematické funkcie

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

abs obušokzáznamsqrt Acos dvojitýlog10srand ako v exppowopálenie opálenie podlaharandTANH ATAN2 FMODkolo opatriť stropom sprevádzahriech cos intsinh

abs ( arg )

Vráti absolútnu hodnotu arg . Arg môže byť buď celočíselným alebo pohyblivým bodom a výsledok sa vráti v rovnakej forme.

ACOS ( arg )

Vráti kosinus oblúka arg , v rozsahu 0, pi radiánov. Arg by mala byť v rozsahu -1,1.

ako v( arg )

Vráti oblúk sínus arg , v rozsahu -pi / 2, pi / 2 radiány. Arg by mala byť v rozsahu -1,1.

opálenie( arg )

Vracia obdĺžnikovú tangenciu arg , v rozsahu -pi / 2, pi / 2 radiány.

ATAN2 ( x, y )

Vracia obdĺžnikovú tangenciu y / X , v rozsahu -pi, pi radians. X a y nemôžu byť obe.

ceil ( arg )

Vráti najmenšiu celočíselnú hodnotu nie menšiu ako arg .

cos ( arg )

Vráti kosínus 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.

double ( arg )

ak arg je pohyblivá hodnota, vráti sa arg , inak konvertuje arg plávajúce a vráti premennú hodnotu.

exp ( arg )

Vráti exponenciálnu hodnotu 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 s plovoucím bodom rozdelenia X podľa y , ak y je 0, vráti sa chyba.

sprevádza ( x, y )

Vypočíta dĺžku hypotenze pravoúhlého trojuholníka ( X * X + y * y ).

int ( arg )

ak arg je celočíselná hodnota, vráti sa arg , inak 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 vyvedený na výkon y , ak X je negatívny, 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.

kolo( arg )

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

sin ( arg )

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

sinh ( arg )

Vráti hyperbolický sinus z 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 dotyčnicu 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 pomocouTcl_CreateMathFunc().

Typy, pretečenie a presnosť

Všetky interné výpočty zahŕňajúce celé čísla sa vykonávajú s typom C dlho a všetky interné výpočty zahŕňajúce pohyblivý bod sa vykonávajú s typom C dvojitý , 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 ``.'' aleboe takže nebudú vyzerať ako celočíselné hodnoty. Napríklad,

expr 20,0 / 5,0

výnos4.0, nie4.

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 C sprintf špecifikátor formátu% d 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áva pomocou porovnania s celočíselnými hodnotami a druhé je vykonané pomocou porovnávania reťazcov potom, čo druhý operand konvertuje na reťazec18, Vzhľadom na tendenciu spoločnosti Tcl považovať hodnoty za čísla vždy, keď je to možné, nie je všeobecne vhodné používať operátorov==keď naozaj chcete porovnanie reťazcov a hodnoty operandov by mohli byť ľubovoľné; je lepšie v týchto prípadoch použiťpovrázok príkaz namiesto toho.

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 už bolo uvedené vyššie, výrazy sa nahradia dvakrát: raz pomocou analyzátora Tcl a raz pomocou expr Príkaz. Napríklad príkazy

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

návrat 11, nie násobok 4. Je to preto, že najprv nahradí analyzátor Tcl$ a + 2 pre premennúb, potomexpr príkaz 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é: Použi muž príkaz ( % muž ), aby ste zistili, ako sa príkaz používa vo vašom konkrétnom počítači.