Linux / Unix ukaz: expr

Ime

expr - Ocenite izraz

Povzetek

expr arg ? arg arg ... ?

Concatenates arg (dodajanje presledkov med njimi), oceni rezultat kot izraz Tcl in vrne vrednost. Operaterji, dovoljeni v izrazih Tcl, so podmnožica operaterjev, dovoljenih v izrazih C, in imajo isti pomen in prednost kot ustrezni operaterji C. Izrazi skoraj vedno dajejo številčne rezultate (vrednosti integer ali plavajoče točke). Na primer, izraz

expr 8.2 + 6

ocenjuje na 14,2. Tcl izrazi se razlikujejo od izrazov C tako, kot so navedeni operandi. Tcl izrazi podpirajo tudi ne-številčne operande in primerjave nizov.

Operande

Izraz Tcl je sestavljen iz kombinacije operandov, operatorjev in oklepajev. Med operandi in operatorji ter oklepajema se lahko uporabi bel prostor; z navodili izraza se zanemarijo. Kjer je mogoče, se operandi razlagajo kot celoštevilčne vrednosti. Celotne vrednosti se lahko določijo v decimalkah (običajni primer), v oktalnem (če je prvi znak operanda 0 ) ali v šestnajstiškem (če sta prva dva znaka operanda 0x ). Če operand nima ene od zgoraj navedenih številskih števil, se ga obravnava kot številka s plavajočo vejico, če je to mogoče. Številke s plavajočimi točkami se lahko določijo na kateri koli način, ki ga sprejme prevajalnik C, skladen z ANSI (razen, da pri večini naprav ne bodo dopuščali nastavitev f , F , l in L ). Na primer, vse naslednje so veljavne številke s plavajočo vejico: 2.1, 3., 6e4, 7.91e + 16. Če nobena numerična interpretacija ni možna, je ostanek ostan kot niz (lahko pa se uporabi le omejen nabor operaterjev).

Operande lahko določite na enega od naslednjih načinov:

[1]

Kot številsko vrednost, bodisi celo število ali plavajoča točka.

[2]

Kot spremenljivka Tcl, uporabite standardno $ notacijo. Vrednost spremenljivke bo uporabljena kot operand.

[3]

Kot niz, zaprt v dvojnih narekovajev. Razčlenjevalnik izrazov bo izvedel backslash, spremenljivke in ukazne substitucije na podatkih med navednicami in uporabljeno vrednost uporabil kot operand

[4]

Kot niz, zaprt z zavihki. Znaki med odprtim nosilcem in ustreznim zapiralnim oklepajem se bodo uporabili kot operand brez kakršnih koli zamenjav.

[5]

Kot ukaz Tcl je priložen v oklepajih. Ukaz bo izveden in njegov rezultat bo uporabljen kot operand.

[6]

Kot matematična funkcija, katere argumenti imajo katero koli od zgornjih oblik za operande, kot je sin ($ x) . Spodaj si oglejte seznam opredeljenih funkcij.

Kjer se zgoraj pojavijo substitucije (npr. Znotraj citiranih nizov), se izvajajo po navodilih izraza. Vendar pa je lahko pred razpisovalnikom izrazov dodatni sloj zamenjave že opravil razčlenjevalnik ukaza. Kot je razloženo v nadaljevanju, je običajno najbolje, da priložite izraze v zavihkih, da preprečite, da bi razčlenjevalnik ukaza izvajal zamenjave vsebine.

Za nekaj primerov preprostih izrazov, naj ima spremenljivka a vrednost 3, spremenljivka b pa ima vrednost 6. Nato ukaz na levi strani vsake od spodnjih črt predstavlja vrednost na desni strani črte:

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

Operaterji

Veljavni operaterji so navedeni spodaj, razvrščeni po padajočem vrstnem redu:

- + ~!

Unalni minus, unary plus, bitno NOT, logično NE. Noben od teh operandov ne sme biti uporabljen za niz operandov, in bitno modre NOT se lahko uporablja samo za celo število.

* /%

Pomnožite, delite, preostanek. Noben od teh operandov se ne sme uporabljati za niz operandov, preostali pa se lahko uporabljajo samo za celo število. Preostanek bo vedno imel enak znak kot delilec in absolutno vrednost manjša od delitelja.

+ -

Dodaj in odštej. Velja za vse numerične operande.

<< >>

Levi in ​​desni premik. Velja samo za celo število operandov. Desni premik vedno propagira znakovni bit.

<> <=> =

Boolove manj, večje, manjše ali enake in večje ali enake. Vsak operator proizvaja 1, če je pogoj resničen, 0 pa drugače. Ti operaterji se lahko uporabljajo za nize in številske operande, pri čemer se uporablja primerjava nizov.

==! =

Boolean enak in ni enak. Vsak operater proizvaja rezultat nič / en. Velja za vse vrste operandov.

&

Bitno in. Velja samo za celo število operandov.

^

Bitno izključno ALI. Velja samo za celo število operandov.

|

Bitno pametno ALI. Velja samo za celo število operandov.

&&

Logično IN. Ustvari 1 rezultat, če sta oba operanda ničelna, 0 drugače. Velja samo za boolovske in numerične (celoštevilske ali plavajoče točke) operande.

||

Logično ALI. Ustvari rezultat 0, če sta oba operanda enaka nič, 1 drugače. Velja samo za boolovske in numerične (celoštevilske ali plavajoče točke) operande.

x ? y : z

If-then-else, kot v C. Če x vrednoti nič, potem je rezultat vrednost y . V nasprotnem primeru je rezultat vrednost z . X- operand mora imeti številčno vrednost.

Za več podrobnosti o rezultatih, ki jih pripravi vsak operater, si oglejte priročnik C. Vsi binarni operaterji so levo-desno na istem nivoju prednost. Na primer ukaz

expr 4 * 2 <7

vrne 0.

&& , || , in ?: operaterji imajo "lažno oceno", tako kot v C, kar pomeni, da operandi niso ovrednoteni, če niso potrebni za določitev rezultata. Na primer, v ukazu

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

le eden od [a] ali [b] bo dejansko ovrednoten, odvisno od vrednosti $ v . Upoštevajte pa, da je to res samo, če je celoten izraz zaprt v oklepajih; drugače bo razčlenjevalnik Tcl ovrednotil [a] in [b], preden bi poklical ukaz expr .

Matematične funkcije

Tcl podpira naslednje matematične funkcije v izrazih:

abs cosh log sqrt acos dvojno log10 srand asin exp pow tan atan rand tanh atan2 fmod okroglo ceil hipot sin cos int sinh

abs ( arg )

Vrne absolutno vrednost arg . Arg je lahko celo število ali plavajoča točka, rezultat pa se vrne v isti obliki.

acos ( arg )

Vrne arc kosinus arg , v razponu [0, pi] radianov. Arg mora biti v razponu [-1,1].

asin ( arg )

Vrne arc sine arg , v razponu [-pi / 2, pi / 2] radianov. Arg mora biti v razponu [-1,1].

atan ( arg )

Vrne arc tangento arg , v razponu [-pi / 2, pi / 2] radianov.

atan2 ( x, y )

Vrne tangento loka y / x v območju [-pi, pi] radianov. x in y ne moreta biti oba 0.

ceil ( arg )

Vrne najmanjšo vrednost celo število, ki ni manjša od arg .

cos ( arg )

Vrne kosinus argona , merjeno v radianih.

cosh ( arg )

Vrne hiperbolični kosinus arg . Če bi rezultat povzročil prelivanje, se vrne napaka.

dvojno ( arg )

Če arg predstavlja plavajočo vrednost, vrne argument , sicer pretvori arg v plavajočo in vrne pretvorjeno vrednost.

exp ( arg )

Vrne eksponentni argument , definiran kot e ** arg . Če bi rezultat povzročil prelivanje, se vrne napaka.

tla ( arg )

Vrne največjo integralno vrednost, ki ni večja od arg .

fmod ( x, y )

Vrne preostali del plavajoče točke delitve x za y . Če je y 0, se vrne napaka.

hipot ( x, y )

Izračuna dolžino hipotenuse pravokotnega trikotnika ( x * x + y * y ).

int ( arg )

Če je arg celo število, povrne arg , v nasprotnem primeru pretvori arg v celoto s skrajšanjem in vrne pretvorjeno vrednost.

log ( arg )

Vrne naravni logaritem arg . Arg mora biti pozitivna vrednost.

log10 ( arg )

Vrne osnovni 10 logaritem arg . Arg mora biti pozitivna vrednost.

pow ( x, y )

Izračuna vrednost x, povečane na moči y . Če je x negativen, y mora biti celo število.

rand ()

Vrne številko s plavajočo vejico od nič do samo manj kot eno, ali matematično, obseg [0,1). Seme prihaja iz notranje ure stroja ali pa se ročno nastavi s srandno funkcijo.

krog ( arg )

Če je arg celo število, vrne argument , sicer pretvori arg v celo število, tako da zaokroži in vrne pretvorjeno vrednost.

sin ( arg )

Vrne sinus arguma , izmerjen v radianih.

sinh ( arg )

Vrne hiperbolični sinus arg . Če bi rezultat povzročil prelivanje, se vrne napaka.

sqrt ( arg )

Vrne kvadratni koren arg . Arg mora biti negeniven.

srand ( arg )

Arg , ki mora biti celo število, se uporablja za ponastavitev semena za generatorja naključnih števil. Vrne prvo naključno številko iz tega semena. Vsak tolmač ima svoje seme.

tan ( arg )

Vrne tangento arg , merjeno v radianih.

tanh ( arg )

Vrne hiperbolični tangent arg .

Poleg teh vnaprej določenih funkcij lahko aplikacije določijo dodatne funkcije z uporabo funkcije Tcl_CreateMathFunc ().

Vrste, prelivanje in natančnost

Vsi notranji izračuni, ki vključujejo cela števila, se izvedejo z dolgim tipom C, vse interne izračune, ki vključujejo plavajočo vejico, se opravijo s tipom C dvojno . Pri pretvorbi niza v plavajočo točko se odkrije presežek eksponentov in povzroči napako Tcl. Za pretvorbo v celo število iz niza je zaznavanje prelivanja odvisno od vedenja nekaterih rutin v lokalni knjižnici C, zato je treba obravnavati kot nezanesljivo. Vsekakor se pri vmesnih rezultatih navadno zanesljivo ne odkrije celotnega preliva in preliva. Overflow in preliv v plavajoči vejici se zazna do stopnje, ki jo podpira strojna oprema, kar je na splošno precej zanesljivo.

Konverzija med notranjimi predstavitvami za celo število, plavajoče točke in niz operandov se izvede samodejno, kot je potrebno. Za aritmetične izračune se uporabijo cela števila, dokler ni vnesena številka s plavajočo vejico, po kateri se uporablja plavajoča točka. Na primer,

expr 5/4

vrne 1, medtem ko

expr 5 / 4.0 expr 5 / ([dolžina niza "abcd"] + 0.0)

obe vrnejo 1.25. Vrednosti plavajoče točke se vedno vrnejo s "` . '' ali e, tako da ne bodo videti kot celoštevilčne vrednosti. Na primer,

expr 20,0 / 5,0

vrne 4.0 , ne 4 .

String operacije

Vrednosti nizov se lahko uporabijo kot operande operatorjev za primerjavo, čeprav ocenjevalec izrazov skuša narediti primerjave kot celo število ali plavajočo točko, če je to mogoče. Če je eden od operandov primerjave niz, drugi pa ima številsko vrednost, se numerični operand vrne v niz z uporabo specifikatorja formata sprintf % d za cela števila in % g za vrednosti s plavajočo vejico. Na primer, ukazi

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

obe vrnejo 1. Prva primerjava se opravi z uporabo celovite primerjave, druga pa z uporabo primerjave nizov po pretvorbi drugega operanda v niz 18 . Zaradi tendence Tcl-a za obravnavo vrednosti kot številk, kadar koli je to mogoče, na splošno ni dobra ideja, da uporabite operaterje, kot je ==, če res želite pretvarjanje nizov in bi lahko bile vrednosti operandov poljubne; v teh primerih je bolje uporabiti ukaz string, namesto tega.

Ocene učinkovitosti

Izrazi v zapahih za najboljšo hitrost in najmanjše zahteve za shranjevanje. To omogoča prevajalnik Tcl bytecode, da ustvari najboljšo kodo.

Kot je navedeno zgoraj, so izrazi dvakrat zamenjani: enkrat z razčlenjevalnikom Tcl in enkrat z ukazom expr . Na primer, ukazi

nastavite 3 niz b {$ a + 2} expr $ b * 4

vrnitev 11, ne večkratnik 4. To je zato, ker bo razčlenjevalnik Tcl najprej nadomestil $ a + 2 za spremenljivko b , nato pa bo ukaz expr ocenil izraz $ a + 2 * 4 .

Večina izrazov ne zahteva drugega kroga zamenjave. Bodisi so zaprti v zavihkih ali, če ne, njihove spremenljivke in ukazne substitucije dajejo številke ali nizi, ki sami ne zahtevajo zamenjave. Ker pa nekaj neobdelanih izrazov potrebuje dva kroga zamenj, mora prevajalnik bytecode oddati dodatna navodila za obravnavo te situacije. Najdražja koda je potrebna za neobdelane izraze, ki vsebujejo ukazne substitucije. Te izraze je treba uvesti z ustvarjanjem nove kode vsakič, ko se izraz izvrši.

Ključne besede

aritmetična, logična , primerjalna, izrazna, mehka primerjava

Pomembno: Uporabite ukaz man ( % man ), da vidite, kako se na vašem računalniku uporablja ukaz.