Příkazy Linux / Unix: expr

název

expr - Vyhodnoťte výraz

Synopse

expr arg ? arg arg ... ?

Spojuje argumenty argum (přidává mezi nimi oddělovací mezery), hodnotí výsledek jako výraz Tcl a vrací hodnotu. Operátory povolené v Tcl výrazech jsou podmnožinou operátorů povolených v C výrazech a mají stejný význam a přednost jako odpovídající operátoři C. Výrazy téměř vždy přinášejí číselné výsledky (celočíselné nebo pohyblivé hodnoty). Například výraz

expr 8.2 + 6

hodnotí na 14.2. Výrazy Tcl se liší od výrazů C ve způsobu zadávání operandů. Také výrazy Tcl podporují nečíselné operandy a porovnávání řetězců.

Operandy

Výraz Tcl se skládá z kombinace operandů, operátorů a závorek. Bílý prostor může být použit mezi operandy a operátory a závorky; ignoruje to instrukce výrazu. Kde je to možné, operandy jsou interpretovány jako celočíselné hodnoty. Celočíselné hodnoty mohou být zadány v desítkovém (normálním případě), v osmičce (pokud je první znak operandu 0 ) nebo v hexadecimálním (pokud jsou první dva znaky operandu 0x ). Pokud operand nemá jeden z výše uvedených celočíselných formátů, pak je s ním zacházeno jako s číslem s plovoucí desetinou, pokud je to možné. Čísla s pohyblivou čárkou mohou být specifikována libovolným ze způsobů přijatých kompilátorem C kompatibilními s ANSI (s výjimkou toho, že přípony f , F , l a L nebudou ve většině instalací povoleny). Například všechny následující jsou platné čísla s pohyblivou čárkou: 2.1, 3., 6e4, 7.91e + 16. Není-li možná numerická interpretace, operand je ponechán jako řetězec (a na něj může být použita pouze omezená sada operátorů).

Operandy mohou být zadány jedním z následujících způsobů:

[1]

Jako číselnou hodnotu, buď celé číslo nebo floating-point.

[2]

Jako proměnná Tcl pomocí standardní notace $ . Hodnota proměnné bude použita jako operand.

[3]

Jako řetězec uzavřený v dvojitých uvozovkách. Syntaktický výraz bude provádět zpětné lomítko, proměnné a nahrazení příkazu na informaci mezi úryvky a použije výslednou hodnotu jako operand

[4]

Jako řetězec uzavřený ve svincích. Postavy mezi otevřenou rovinou a odpovídajícími rovnými úchyty budou použity jako operand bez jakýchkoliv náhrad.

[5]

Jako příkaz Tcl uzavřený v závorkách. Příkaz bude proveden a jeho výsledek bude použit jako operand.

[6]

Jako matematická funkce, jejíž argumenty mají některou z výše uvedených forem pro operandy, jako je sin ($ x) . Seznam definovaných funkcí naleznete níže.

Tam, kde dochází k nahrazení výše (např. Uvnitř citovaných řetězců), jsou prováděny podle pokynů výrazu. Nicméně další vrstva nahrazení již mohla provést příkazový analyzátor před voláním procesoru exprese. Jak je uvedeno níže, je obvykle nejlepší, když se v překryvnách uzavírají výrazy, aby zabránil analyzátoru příkazů provádět náhrady obsahu.

U některých příkladů jednoduchých výrazů předpokládejme, že proměnná a má hodnotu 3 a proměnná b má hodnotu 6. Pak příkaz na levé straně každého z níže uvedených řádků vytvoří hodnotu na pravé straně řádku:

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

Operátoři

Platné operátory jsou uvedeny níže, seskupeny v sestupném pořadí:

- + ~!

Unary mínus, unary plus, bit-moudrý NOT, logický NOT. Žádný z těchto operandů nesmí být použit na řetězec operandy, a bit-mise NOT může být aplikován pouze na celá čísla.

* /%

Vynásobit, rozdělit, zbytek. Žádný z těchto operandů nesmí být použit pro řetězcové operandy a zbytek může být aplikován pouze na celá čísla. Zbytek bude mít vždy stejné znaménko jako dělitel a absolutní hodnotu menší než dělitel.

+ -

Přidat a odečíst. Platí pro libovolné číselné operandy.

<< >>

Levý a pravý posun. Platí pouze pro celé operandy. Pravý posun vždy propaguje znaménkový bit.

<> <=> =

Boolean menší, větší, menší nebo rovné a větší nebo rovné. Každý operátor vytvoří 1, pokud je podmínka pravdivá, 0 jinak. Tyto operátory mohou být použity na řetězce i na číselné operandy, v tomto případě je použito porovnání řetězců.

==! =

Boolean je rovný a není stejný. Každý operátor vytvoří výsledek nula / jeden. Platí pro všechny typy operandů.

A &

Bitově a AND. Platí pouze pro celé operandy.

^

Kousek exkluzivní OR. Platí pouze pro celé operandy.

|

Bitově nebo NEBO. Platí pouze pro celé operandy.

&&

Logické AND. Vytvoří 1 výsledek, pokud oba operandy jsou nenulové, jinak 0. Platí pouze pro booleovské a číselné (celočíselné nebo plovoucí body) operandy.

||

Logické OR. Výsledkem je 0, pokud jsou obě operandy nulové, 1 jinak. Platí pouze pro booleovské a číselné (celočíselné nebo plovoucí body) operandy.

x ? y : z

Pokud-pak-jinak, jako v C. Pokud x hodnotí na nenulovou hodnotu, je výsledkem hodnota y . V opačném případě je výsledkem hodnota z . Operand x musí mít číselnou hodnotu.

Podrobnější informace o výsledcích jednotlivých operátorů naleznete v příručce C. Všechny skupiny binárních operátorů se shodují z stejné úrovně přednosti. Například příkaz

expr 4 * 2 <7

vrátí 0.

&& , || , a ?: operátoři mají `` lenivé hodnocení '' stejně jako v jazyce C, což znamená, že operandy nejsou vyhodnocovány, pokud nejsou potřebné k určení výsledku. Například v příkazu

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

pouze jedna z hodnot [a] nebo [b] bude skutečně vyhodnocena v závislosti na hodnotě $ v . Všimněte si však, že to platí pouze tehdy, pokud je celý výraz uzavřen ve svincích; jinak analyzátor Tcl vyhodnotí jak [a], tak [b] před vyvoláním příkazu expr .

Matematické funkce

Tcl podporuje následující matematické funkce ve výrazech:

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

abs ( arg )

Vrací absolutní hodnotu arg . Arg může být buď celočíselný nebo pohyblivý bod a výsledek je vrácen ve stejné podobě.

acos ( arg )

Vrací ark kosinus arg , v rozsahu [0, pi] radians. Arg by měl být v rozmezí [-1,1].

asin ( arg )

Vrací arkus sinus arg , v rozsahu radiálů [-pi / 2, pi / 2]. Arg by měl být v rozmezí [-1,1].

atan ( arg )

Vrací ark tangent arg , v rozsahu [-pi / 2, pi / 2] radiány.

atan2 ( x, y )

Vrací oblouk tangenty y / x v rozsahu [-pi, pi] radians. x a y nemohou být obě.

ceil ( arg )

Vrací nejmenší celočíselnou hodnotu ne méně než arg .

cos ( arg )

Vrací cosinus argu , měřeno v radiánech.

cosh ( arg )

Vrátí hyperbolický kosinus arg . Pokud výsledek způsobí přetečení, vrátí se chyba.

dvojité ( arg )

Pokud arg je plovoucí hodnota, vrací arg , jinak konvertuje arg na plovoucí a vrátí konvertovanou hodnotu.

exp ( arg )

Vrací exponenciál arg , definovaný jako e ** arg . Pokud výsledek způsobí přetečení, vrátí se chyba.

podlaha ( arg )

Vrací největší integrální hodnotu ne větší než arg .

fmod ( x, y )

Vrátí zbývající část rozdělení rozdělení x o y . Pokud y je 0, vrátí se chyba.

hypot ( x, y )

Vypočítá délku hypotenze pravoúhlého trojúhelníku ( x * x + y * y ).

int ( arg )

Pokud arg je celočíselná hodnota, vrací arg , jinak konvertuje arg na celé číslo zkrácením a vrátí konvertovanou hodnotu.

log ( arg )

Vrací přirozený logaritmus arg . Arg musí být pozitivní hodnota.

log10 ( arg )

Vrátí logaritmus základny 10 arg . Arg musí být pozitivní hodnota.

pow ( x, y )

Vypočítá hodnotu x zvýšené na hodnotu y . Je-li x záporné, y musí být celočíselná hodnota.

rand ()

Vrací číslo s plovoucí desetinou z nuly na méně než jednu nebo z matematického hlediska rozsah [0,1]. Osivo pochází z vnitřních hodin stroje nebo může být nastaveno manuálně pomocí funkce srand.

kulatý ( arg )

Pokud arg je celočíselná hodnota, vrací arg , jinak konvertuje arg na celé číslo zaokrouhlováním a vrátí konvertovanou hodnotu.

sin ( arg )

Vrací sine arg , měřeno v radiánech.

sinh ( arg )

Vrátí hyperbolický sinus arg . Pokud výsledek způsobí přetečení, vrátí se chyba.

sqrt ( arg )

Vrací druhou odmocninu arg . Arg nesmí být negativní.

srand ( arg )

Arg , který musí být celé číslo, se používá k resetování osiva generátoru náhodných čísel. Vrací první náhodné číslo z tohoto semena. Každý tlumočník má své vlastní osivo.

tan ( arg )

Vrací tangent arg , měřený v radiánech.

tanh ( arg )

Vrací hyperbolickou tečnu arg .

Kromě těchto předdefinovaných funkcí mohou aplikace definovat další funkce pomocí Tcl_CreateMathFunc ().

Typy, přetečení a přesnost

Všechny interní výpočty zahrnující celá čísla se provádějí s typem C dlouhým a všechny interní výpočty zahrnující plovoucí bod se provádějí s dvojitým typem C. Při převodu řetězce na plovoucí bod je zjištěn přetečení exponentu a výsledkem je chyba Tcl. Pro konverzi na celé číslo z řetězce, detekce přetečení závisí na chování některých rutin v místní knihovně C, takže by měla být považována za nespolehlivou. V každém případě celkový přetečení a podtlak nejsou obecně spolehlivě zjištěny pro průběžné výsledky. Přetečení s plovoucí desetinnou čárkou a podtok je zjištěno v míře podporované hardwarem, což je obecně docela spolehlivé.

Konverze mezi interními reprezentacemi pro operátory s celočíselným, plovoucím a řetězovým operandem se provádí automaticky podle potřeby. Pro aritmetické výpočty se používají celá čísla, dokud se neprovede číslo s plovoucí desetinnou čárkou a poté se použije pohyblivá čárka. Například,

expr 5/4

vrátí 1, zatímco

expr 5 / 4.0 expr 5 / ([délka řetězce "abcd"] + 0.0)

oba vracejí 1,25. Hodnoty s pohyblivou čárkou jsou vždy vráceny znakem `` . '' nebo e tak, aby nevypadaly jako celočíselné hodnoty. Například,

expr 20,0 / 5,0

vrátí 4.0 , ne 4 .

Operace řetězce

Hodnoty řetězce mohou být použity jako operandy srovnávacích operátorů, i když se hodnotitel výrazu pokusí provést srovnání jako celočíselný nebo pohyblivý bod, když to může. Pokud je jeden z operandů porovnání řetězec a druhý číselná hodnota, číselný operand se převede zpět na řetězec pomocí specifikátoru formátu C sprintuf % d pro celá čísla a % g pro hodnoty s pohyblivou hodnotou. Například příkazy

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

oba vrátí 1. První porovnání se provádí pomocí porovnání celých čísel a druhé je provedeno porovnáním řetězců poté, co byl druhý operand převeden na řetězec 18 . Vzhledem k tomu, že Tcl má tendenci počítat hodnoty jako čísla vždy, když je to možné, není obecně dobrý nápad používat operátory jako ==, když opravdu chcete porovnání řetězců a hodnoty operandů by mohly být libovolné; v těchto případech je lepší použít místo toho řetězec .

Účinky

Přiložte výrazy do ramen pro nejlepší rychlost a nejmenší požadavky na skladování. To umožňuje kompilátoru Tcl bytecode vygenerovat nejlepší kód.

Jak bylo uvedeno výše, výrazy jsou nahrazeny dvakrát: jednou pomocí analyzátoru Tcl a jednou příkazem expr . Například příkazy

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

návrat 11, nikoliv násobek 4. Je tomu tak proto, že analyzátor Tcl nejprve nahradí $ a + 2 pro proměnnou b , pak příkaz expr vyhodnotí výraz $ a + 2 * 4 .

Většina výrazů nevyžaduje druhé kolo substitucí. Buď jsou uzavřeny ve svincích, nebo pokud ne, jejich variabilní a příkazové substituce poskytují čísla nebo řetězce, které samy o sobě nevyžadují náhradu. Protože však několik nevyžádaných výrazů potřebuje dvě kola nahrazení, kompilátor bytecode musí vydávat další pokyny k vyřešení této situace. Nejkrajnější kód je vyžadován pro nezpracované výrazy, které obsahují nahrazení příkazu. Tyto výrazy musí být implementovány generováním nového kódu při každém spuštění výrazu.

Klíčová slova

aritmetický, booleovský , porovnávat, výraz, fuzzy srovnání

Důležité: Použijte příkaz man ( % man ), abyste zjistili, jaký příkaz se používá v konkrétním počítači.