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"} 0Az ü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 <70 é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 sinhabs ( 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/4visszaté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,0visszaté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 * 4vissza 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.