Linux / Unix parancs: expr

Név

expr - Értékelje a kifejezést

Szinopszis

expr arg ? arg arg ... ?

Az argumentumokat összekapcsolja (szétválasztó terek között), az eredményt Tcl kifejezésként értékeli, és visszaadja az értéket. A Tcl kifejezésekben megengedett operátorok a C kifejezésekben engedélyezett operátorok részhalmaza, és ugyanolyan jelentéssel bírnak, mint a megfelelő C operátorok. Az kifejezések szinte mindig számszerű eredményeket hoznak (egész vagy lebegőpontos értékek). Például a kifejezés

8,2 + 6

értékeli a 14,2. A Tcl kifejezések különböznek a C-kifejezésektől az operandusok megadásával. A Tcl kifejezések továbbá nem numerikus operandusokat és string összehasonlításokat is támogatnak.

operandusok

A Tcl kifejezés operandusok, operátorok és zárójelek kombinációjából áll. Fehér teret lehet használni az operandusok és a kezelők és a zárójelek között; a kifejezés utasításai figyelmen kívül hagyják. Ahol lehetséges, az operandusokat egész számként értelmezik. Az integer értékek decimális (normál esetben), oktális (ha az operandus első karaktere 0 ) vagy hexadecimális (ha az operandus első két karaktere 0x ), megadható . Ha egy operandusnak nincs a fentiekben megadott egész szám, akkor azt lebegőpontos számként kell kezelni, ha ez lehetséges. A lebegőpontos számokat bármely ANSI-kompatibilis C fordító által elfogadott módon lehet megadni (kivéve, hogy az f , F , L és L utótagok a legtöbb telepítésben nem engedélyezettek). Például az alábbiak mindegyike érvényes lebegőpontos számok: 2.1, 3., 6e4, 7.91e + 16. Ha nem lehetséges numerikus értelmezés, akkor egy operandus karakterlánc marad (és csak korlátozott számú operátor adható hozzá).

Az operandusokat az alábbi módokon lehet megadni:

[1]

Számértékként, egész szám vagy lebegőpont.

[2]

Mint Tcl változó, standard $ jegyzet használatával. A változó értékét operandusként használják.

[3]

Mint egy kettős idézőjelben zárt karaktersorozat. A kifejezésszerkesztő az idézőjelek közötti információt a visszalövés, a változó és a parancs helyettesítésével hajtja végre, és az eredményül kapott értéket operandusként használja

[4]

Mint egy zsinór zárva. A nyílt zárójel és az illeszkedő zárójelek közötti karaktereket az operandusként kell használni, mindenféle helyettesítés nélkül.

[5]

Tcl parancsként zárójelben. A parancs végrehajtásra kerül és az eredményt operandusként fogják használni.

[6]

Matematikai függvényként, amelynek érvei az operandusok fenti formáihoz tartoznak, mint például a bűn ($ x) . Lásd alább a meghatározott funkciók listáját.

Abban az esetben, ha a fenti helyettesítések (pl. Belső idézőjelek) előfordulnak, azokat a kifejezés utasításai végzik. A parancselemző azonban már elvégezhet egy további helyettesítési réteget, mielőtt az expressziós processzort meghívnák. Az alábbiakban ismertetettek szerint általában a zárójelben lévő kifejezéseket csatolni kell ahhoz, hogy megakadályozzák a parancsszerkesztő számára a tartalom cseréjét.

Néhány példa az egyszerű kifejezésekre, feltételezzük, hogy az a változónak 3 értéke van, és a b változónak 6 értéke van. Ezután az alábbi sorok bal oldalán lévő parancs adja meg a sor jobb oldalán lévő értéket:

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

Az üzemeltetők

Az érvényes operátorok az alábbiak szerint vannak felsorolva, csökkenő sorrendben csoportosítva:

- + ~!

Unary mínusz, unary plus, bit-wise NEM, logikus NEM. Ezen operandusok egyike sem alkalmazható a string operandusokra, és bit-wise NOT csak az egész számokra alkalmazható.

* /%

Szorozzuk meg, oszd meg, maradjunk. Ezen operandusok egyike sem alkalmazható string operandusokra, a maradék csak egész számokra alkalmazható. A maradék mindig ugyanazt a jelet kapja, mint az osztó, és abszolút érték kisebb, mint az osztó.

+ -

Hozzáadás és kivonás. Valamennyi numerikus operandusra érvényes.

<< >>

Bal és jobb műszak. Csak egész operandusokra érvényes. A jobb váltás mindig a jelbitet továbbítja.

<> <=> =

A logikai érték kisebb, nagyobb, kisebb vagy egyenlő, és nagyobb vagy egyenlő. Minden operátor 1-et termel, ha a feltétel igaz, 0 egyébként. Ezeket az operátorokat alkalmazhatjuk a karakterláncokra és a numerikus operandusokra is, mely esetben string-összehasonlítást használunk.

==! =

Boolean egyenlő és nem egyenlő. Minden operátor nulla / egy eredményt ad. Valamennyi operandus típushoz érvényes.

&

Bit-bölcs AND. Csak egész operandusokra érvényes.

^

Bit-bölcs kizárólagos VAGY. Csak egész operandusokra érvényes.

|

Bit-bölcs OR. Csak egész operandusokra érvényes.

&&

Logikai ÉS. 1 eredményt produkál, ha mindkét operandus nem nulla, 0 egyébként. Érvényes logikai és numerikus (egész vagy lebegőpontos) operandusokra.

||

Logikai VAGY. 0 eredményt ad, ha mindkét operandus nulla, 1 egyébként. Érvényes logikai és numerikus (egész vagy lebegőpontos) operandusokra.

x ? y : z

If-then-else, mint a C-ban. Ha x értéke nem nulla, akkor az eredmény az y értéke. Ellenkező esetben az eredmény z érték. Az x operandusnak numerikus értékkel kell rendelkeznie.

Lásd a C kézikönyvet az egyes piaci szereplők által készített eredményekről. Az összes bináris operátorcsoport balról jobbra ugyanazon elsőbbségi szinten. Például a parancsot

expr 4 * 2 <7

0 értéket ad vissza.

A && , || , és ?: a szereplők "lusta értékelés" -nek felelnek meg, mint a C-ben, ami azt jelenti, hogy az operandusokat nem értékelik, ha nincs szükségük az eredmény meghatározására. Például a parancsban

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

csak a [a] vagy a [b] egyikét értékeljük, a $ v értéktől függően. Ne feledje azonban, hogy ez csak akkor igaz, ha az egész kifejezés zárójelben van; ellenkező esetben a Tcl elemző értékeli mind az [a], mind a [b] -t, mielőtt az expr parancsot meghívná .

Matematikai függvények

A Tcl a következő matematikai függvényeket támogatja:

abs cosh log sqrt acos dupla log10 srand asin exp pow tan atan padló rand tanh atan2 fmod kerek ceil hypot sin cos int sinh

abs ( arg )

Visszaadja az arg . Abszolút értékét. Arg lehet egész szám vagy lebegőpont, és az eredmény ugyanabban az alakban jelenik meg.

acos ( arg )

Visszaadja arg argon koszinuszát a [0, pi] radian tartományban. Arg- nak a [-1,1] tartományban kell lennie.

asin ( arg )

Visszaadja az arg- ív szinuszát a [-pi / 2, pi / 2] radian tartományban. Arg- nak a [-1,1] tartományban kell lennie.

atan ( arg )

Visszaadja az arg ív tangensét a [-pi / 2, pi / 2] radian tartományban.

atan2 ( x, y )

Visszaadja az y / x ív tangensét a [-pi, pi] radian tartományban. x és y nem mindkettő lehet 0.

ceil ( arg )

A legalacsonyabb egészértéket adja meg, nem kevesebb, mint arg .

cos ( arg )

Visszaküldi az arg arginin koszinusát, radianban mérve.

cosh ( arg )

Az argumentum hiperbolikus koszinuszát adja vissza . Ha az eredmény túlcsordulást okoz, hiba lép fel.

kettős ( arg )

Ha az arg egy lebegő érték, akkor visszatér argumentumhoz , egyébként konverzi az argust lebegő és visszaadja a konvertált értéket.

exp ( arg )

Visszaadja az arg- exponenciális értéket, amelyet e ** arg . Ha az eredmény túlcsordulást okoz, hiba lép fel.

padló ( arg )

A legnagyobb integrális értéket nem nagyobb, mint az arg .

fmod ( x, y )

Az x osztás lebegőpontos maradékát adja vissza y-vel . Ha y értéke 0, hibaüzenet jelenik meg.

hipot ( x, y )

Számítja ki a derékszögű háromszög ( x * x + y * y ) hypotenusának hosszát.

int ( arg )

Ha az arg egy egész szám, akkor érdemes az arg , egyébként az arg argumentumot egész számra konvertálja, és visszaadja az átalakított értéket.

log ( arg )

Visszaadja az arg . Természetes logaritmusát. Az Arg- nak pozitív értéknek kell lennie.

log10 ( arg )

Visszaadja az argumentum alap 10 logaritmusát. Az Arg- nak pozitív értéknek kell lennie.

pow ( x, y )

Számítja ki az x értékét, amelyet az y teljesítményre emelt. Ha x negatív, y egész számnak kell lennie.

rand ()

Egy lebegőpontos számot nulláról kevesebb mint egyre, vagy matematikai szempontból a [0,1] tartományra tér vissza. A vetőmag a gép belső órájából származik, vagy manuálisan beállítható a srand funkcióval.

kör ( arg )

Ha az arg egy egész szám, akkor érdemes az argumentumot argumentumként megadni.

sin ( arg )

Visszaadja az arg argumentumát radianban mérve.

sinh ( arg )

Az argumentum hiperbolikus szinuszát adja vissza . Ha az eredmény túlcsordulást okoz, hiba lép fel.

sqrt ( arg )

Az argumentum négyzetgyökét adja vissza . Az Arg nem negatívnak kell lennie.

srand ( arg )

Az argumentum , amelynek egész számnak kell lennie, a véletlenszám-generátor magjának visszaállítására szolgál. Ebből a magból az első véletlen számot adja vissza. Minden tolmács saját maggal rendelkezik.

tan ( arg )

Visszaküldi az arg argens tangensét, radianban mérve.

tanh ( arg )

Az argumentum hiperbolikus tangensét adja vissza .

Ezen előre definiált függvények mellett az alkalmazások további funkciókat is meghatározhatnak a Tcl_CreateMathFunc () használatával.

Típusok, túlcsordulás és precízió

Az egész számokat tartalmazó számítások hosszú C típusúak, és minden lebegőpontos belső számítás C-típusú kettős . Amikor egy karakterláncot lebegőpontra konvertál, exponens túlcsordulást érzékel és Tcl hibát eredményez. Ha a karakterláncból egész számra konvertáljuk, akkor a túlcsordulás kimutatása a helyi C könyvtár bizonyos rutinainak viselkedésétől függ, ezért megbízhatatlannak kell lennünk. Mindenesetre az egész szám túlcsordulása és alulfolyása általában nem mutatható ki megbízhatóan a köztes eredményeknél. A lebegőpontos túlcsordulás és alulfolyás érzékelhető a hardver által támogatott mértékben, ami általában elég megbízható.

Az integer, a lebegőpontos és a string operandusok belső ábrázolásai közötti konverzió automatikusan történik, ha szükséges. Az aritmetikai számításokhoz egész számokat használnak addig, amíg újabb lebegőpontos számot vezetnek be, majd lebegőpontot használnak. Például,

expr 5/4

visszatér 1, míg

expr 5 / 4,0 expr 5 / ([string hossza "abcd"] + 0,0)

mindkettő visszatér 1,25. A lebegőpontos értékeket mindig visszaadja a "` . '' vagy egy e értéket úgy, hogy nem fognak egész értékek. Például,

expr 20,0 / 5,0

visszatér 4,0 , nem 4 értékkel .

String műveletek

A string értékeket használhatjuk az összehasonlító operátorok operandusaként, bár a kifejezésértékelő az egész számot vagy lebegőpontot próbálja összehasonlítani, amikor csak lehetséges. Ha az összehasonlítás egyik operandusa egy karakterlánc, a másiknak numerikus értéke van, akkor a numerikus operandust vissza kell konvertálni egy karakterláncra a C sprintf formátum specifikálóval % d egész számok és % g változópontos értékek esetén. Például a parancsok

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

mindkettő visszatér 1. Az első összehasonlítást az egész számtani összehasonlítással végezzük, a második pedig a string művelet végrehajtása után történik, miután a második operandus átváltott a 18- as stringre. Mivel a Tcl hajlamos arra, hogy a számokat értékekként kezelje, amikor csak lehetséges, általában nem jó ötlet használni olyan operátorokat, mint a ==, ha valóban sztring összehasonlítást akarunk és az operandusok értéke tetszőleges lehet; ezekben az esetekben jobb, ha a string parancsot használja.

Teljesítményi szempontok

A zárójelek kifejezését a legjobb sebesség és a legkisebb tárolási igények közé foglalja. Ez lehetővé teszi a Tcl bytecode fordító számára a legjobb kód létrehozását.

Mint fent említettük, a kifejezések kétszer vannak helyettesítve: egyszer a Tcl elemzővel és egyszer az expr paranccsal. Például a parancsok

állítson be egy 3 készletet b {$ a + 2} expr $ b * 4

vissza 11, nem pedig 4-es számú. Ez azért van, mert a Tcl elemző először $ a + 2 helyett a b változót, majd az expr parancs kiértékeli a $ a + 2 * 4 kifejezést.

A legtöbb kifejezés nem igényel második helyettesítést. Vagy zárójelben vannak elhelyezve, vagy ha nem, a változó és parancs helyettesítésük olyan számokat vagy vonalakat tartalmaz, amelyeknek maguk nem helyettesítik egymást. Azonban, mivel néhány unbraced kifejezésnek két cseréje van, a bytecode fordítónak további utasításokat kell kiadnia a helyzet kezelésére. A legdrágább kód szükséges a nem helyettesíthető kifejezésekhez, amelyek parancscseréket tartalmaznak. Ezeket a kifejezéseket úgy kell végrehajtani, hogy új kódot generálnak minden alkalommal, amikor a kifejezés végrehajtásra kerül.

Kulcsszavak

aritmetikai, logikai , összehasonlítás, kifejezés, fuzzy összehasonlítás

Fontos: Az ember paranccsal ( % man ) tekintse meg, hogyan használják a parancsot az adott számítógépen.