Linukso / Unikso Komando: expr

Nomo

expr - Evaluu esprimon

Sinopsis

expr arg arg arg ... ?

Konkatenatoj (aldonante apartigajn spacojn inter ili), taksas la rezulton kiel Tcl-esprimo kaj redonas la valoron. La telefonistoj permesitaj en Tcl-esprimoj estas subaro de la telefonistoj permesitaj en C-esprimoj, kaj ili havas la saman signifon kaj prioritaton kiel la respondaj C-operatoroj. Esprimoj preskaŭ ĉiam donas nombrajn rezultojn (entjerajn aŭ flospunajn valorojn). Ekzemple, la esprimo

expr 8.2 + 6

taksas 14.2. Tcl-esprimoj diferencas de C-esprimoj en la maniero, kiam operacioj estas specifitaj. Ankaŭ, Tcl-esprimoj subtenas ne-nombrajn operandojn kaj ĉenajn komparojn.

Operandoj

Tcl-esprimo konsistas el kombinaĵo de operandoj, operatoroj kaj paréntesis. Blanka spaco povas esti uzata inter la operandoj kaj operatoroj kaj paréntesis; ĝi estas ignorita de la instrukcioj de la esprimo. Kie eblas, operandoj estas interpretitaj kiel entjeraj valoroj. Integrimaj valoroj povas esti specifitaj en decimala (la normala kazo), en octala (se la unua karaktero de la operando estas 0 ) aŭ en la heksadeksa (se la du unuaj signoj de la operando estas 0x ). Se opero ne havas unu el la entjeraj formatoj donitaj pli supre, tiam ĝi estas traktita kiel flospunkta nombro se tio estas ebla. La numeroj de flotaj punktoj povas esti specifitaj en iu ajn el la manieroj akceptitaj de ANSI-compliant C-kompilaĵo (krom ke la f , F , l kaj L- sufiksoj ne estos permesataj en plejpartoj de instalaĵoj). Ekzemple, ĉiuj sekvaj estas valida flospunaj nombroj: 2.1, 3., 6e4, 7.91e + 16. Se neniu nombra interpreto estas ebla, tiam operacio restas kiel ĉeno (kaj nur limigita aro de telefonistoj povas esti aplikita al ĝi).

Operandoj povas esti specifitaj en iu ajn el la jenaj manieroj:

[1]

Kiel nombra valoro, ĉu entjero aŭ flospunkta.

[2]

Kiel variablo Tcl, uzanta norma $ notacio. La valoro de la variablo estos uzata kiel la opero.

[3]

Kiel ĉeno enfermita en duoblaj citaĵoj. La esprima analizilo plenumos backslash, variablon kaj komandajn anstataŭojn sur la informoj inter la citaĵoj kaj uzos la rezultantan valoron kiel la operandon

[4]

Kiel ĉeno enfermita en krampoj. La signoj inter la malferma braceo kaj la kongrua flanko estas uzataj kiel la opero sen ia ajn anstataŭaĵo.

[5]

Kiel Tcl-komando kusxita inter krampoj. La komando estos ekzekutita kaj ĝia rezulto estos uzata kiel la opero.

[6]

Kiel matematika funkcio kies argumentoj havas iujn el la supraj formoj por operandoj, kiel peko ($ x) . Vidu sube por listo de difinitaj funkcioj.

Kie anstataŭigoj okazas pli supre (ekz. En kotizitaj ĉenoj), ili estas plenumitaj per la instrukcioj de la esprimo. Tamen, aldona tavolo de anstataŭo eble jam estis farita de la komanda analizilo antaŭ ol la esprima procesoro nomiĝis. Kiel oni diskutas sube, kutime estas pli bone ĉirkaŭigi esprimojn en krampoj por malhelpi la komandan analizilon prezenti anstataŭojn sur la enhavon.

Por iuj ekzemploj de simplaj esprimoj, supozu, ke la variablo havas la valoron 3 kaj la variablo b havas la valoron 6. Tiam la komando sur la maldekstra flanko de ĉiu el la jenaj linioj produktos la valoron ĉe la dekstra flanko de la linio:

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

Telefonistoj

La validaj telefonistoj estas listigitaj pli sube, kolektitaj en malpliiĝanta ordo de prioritato:

- + ~!

Unario minus, unuara plus, bit-saĝa NE, logika NE. Neniu el ĉi tiuj operandoj povas esti aplikata al kordoj, kaj neblastaj NE povas esti aplikataj nur al entjeroj.

* /%

Multobligu, dividu, resti. Neniu el ĉi tiuj operandoj povas esti aplikata al kordoj, kaj restaĵo povas esti aplikata nur al entjeroj. La restaĵo ĉiam havos la saman signon kiel la divizoro kaj absoluta valoro pli malgranda ol la divizoro.

+ -

Aldoni kaj subtrahi. Valida por iuj nombraj operandoj.

<< >>

Maldekstra kaj dekstra shift. Valida por entjeraj operandoj nur. Ĝusta movado ĉiam propagas la signon iomete.

<> <=> =

Bulea malpli, pli granda, malpli ol aŭ egala, kaj pli granda ol aŭ egala. Ĉiu telefonisto produktas 1 se la kondiĉo estas vera, 0 alie. Ĉi tiuj telefonistoj povas esti aplikitaj al ŝnuroj kaj nombraj operandoj, en kies kazo kordoj estas uzataj.

==! =

Bulea egalaj kaj ne egalaj. Ĉiu telefonisto produktas nulon / unu rezulto. Valida por ĉiuj operandaj tipoj.

&

Bilata KAJ. Valida por entjeraj operandoj nur.

^

Bone-saĝa ekskluziva OR. Valida por entjeraj operandoj nur.

|

Bedaŭra Aŭ. Valida por entjeraj operandoj nur.

&&

Logika Kaj. Produktas 1 rezulto se ambaŭ operandoj estas ne-nuloj, 0 alie. Valida por booleaj kaj nombraj (entjeroj aŭ flosantaj punktoj) nur operandoj.

||

Logika OR Produktas 0 rezulton se ambaŭ operandoj estas nulo, 1 alie. Valida por booleaj kaj nombraj (entjeroj aŭ flosantaj punktoj) nur operandoj.

x ? y : z

Se-tiam-alie, kiel en C. Se x taksas al ne-nulo, tiam la rezulto estas la valoro de y . Alie, la rezulto estas la valoro de z . La operacio x devas havi nombran valoron.

Vidu la C-manlibron por pliaj detaloj pri la rezultoj produktitaj de ĉiu operatoro. Ĉiuj grupoj de binaraj operatoroj maldekstre dekstre ene de la sama nivelo de prioritato. Ekzemple, la komando

expr 4 * 2 <7

revenas 0.

La && , || , kaj ?: telefonistoj havas '' pigran taksadon ', same kiel en C, kio signifas, ke operandoj ne estas taksataj, se ili ne bezonas por determini la rezulton. Ekzemple, en la komando

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

nur unu el [a][b] efektive estos taksata, laŭ la valoro de $ v . Rimarku, tamen, ke ĉi tio estas nur vera se la tuta esprimo estas kadrita en krampoj; alie, la Tcl-analizilo taksos ambaŭ [a] kaj [b] antaŭ alpreĝante la expr- ordonon.

Matematikaj Funkcioj

Tcl subtenas la jenajn matematikajn funkciojn en esprimoj:

abs kasko log sqrt acos duobla log10 kvadrataj asin exp puldoro ĉe piso rand tanh atan2 fmod ronda ceilo hipot sin cos int sinh

abs ( arg )

Revenas la absoluta valoro de arg . Arg eble estas entjero aŭ flospunkta, kaj la rezulto estas redonita en la sama formo.

akos ( arg )

Revenas la arka kosinuso de arg , en la gamo [0, pi] radianoj. Arg devus esti en la gamo [-1,1].

asin ( arg )

Revenas la arkon sin de arg , en la gamo [-pi / 2, pi / 2] radianoj. Arg devus esti en la gamo [-1,1].

atan ( arg )

Revenas la arka tangento de arg , en la gamo [-pi / 2, pi / 2] radianoj.

atan2 ( x, y )

Revenas la arka tangento de y / x , en la gamo [-pi, pi] radianoj. x kaj y ne povas esti ambaŭ.

cela ( arg )

Revenas la plej malgranda entjera valoro ne malpli ol arg .

cos ( arg )

Revenas la kosinuson de arg , mezurita en radianoj.

cosh ( arg )

Revenas la hiperbola kosinuso de arg . Se la rezulto kaŭzus superfluon, eraro estas redonita.

duobla ( arg )

Se arg estas flosanta valoro, redonas arg , alie konvertas arg al flosanta kaj redonas la konvertitan valoron.

exp ( arg )

Revenas la eksponenta funkcio de arg , difinita kiel e ** arg . Se la rezulto kaŭzus superfluon, eraro estas redonita.

etaĝo ( arg )

Revenas la plej grandan integran valoron ne pli granda ol arg .

fmod ( x, y )

Revenas la flosanta punkto restaĵo de la divido de x per y . Se y estas 0, eraro estas redonita.

hipoteko ( x, y )

Komputas la longon de la hipotenuso de dekstra angulo ( x * x + y * y ).

int ( arg )

Se arg estas entjera valoro, redonas arg , alie konvertas arg al entjero per truncado kaj redonas la konvertitan valoron.

log ( arg )

Revenas la natura logaritmo de arg . Arg devas esti pozitiva valoro.

log10 ( arg )

Revenas la bazon 10 logaritmon de arg . Arg devas esti pozitiva valoro.

pulko ( x, y )

Komputas la valoro de x levita al la potenco y . Se x estas negativa, kaj devas esti entjera valoro.

rand ()

Revenas flosanta punkto nombro de nulo ĝis nur malpli ol unu aŭ, en matematikaj terminoj, la gamo [0,1). La semo venas de la interna horloĝo de la maŝino aŭ povas esti metita manlibro kun la sranda funkcio.

ronda ( arg )

Se arg estas entjera valoro, redonas arg , alie konvertas arg al entjero per rondado kaj redonas la konvertitan valoron.

peko ( arg )

Revenas la sinon de arg , mezurita en radianoj.

sinh ( arg )

Revenas la hiperbola sinuso de arg . Se la rezulto kaŭzus superfluon, eraro estas redonita.

sqrt ( arg )

Revenas la kvadratan radikon de arg . Arg devas esti ne negativa.

srand ( arg )

La arg , kiu devas esti entjero, estas uzata por restarigi la semon por la hazarda nombra generatoro. Revenas la unuan hazarda nombro de tiu semo. Ĉiu interpretisto havas sian propran semon.

tan ( arg )

Revenas la tangenton de arg , mezurita en radianoj.

tanh ( arg )

Revenas la hiperbola tangento de arg .

Krom ĉi tiuj antaŭdifinitaj funkcioj, la aplikoj povas difini aldonajn funkciojn uzante Tcl_CreateMathFunc ().

Tipoj, Superfluo kaj Precizeco

Ĉiuj internaj komputiloj engaĝantaj entjeroj estas faritaj kun la C-tipo longa , kaj ĉiuj internaj komputiloj engaĝantaj flospunkto estas faritaj kun la C-tipo duobla . Konvertinte ĉenon al flospunkto, eksponenta superfluo estas detektita kaj rezultas en Tcl-eraro. Por konvertiĝo al entjero de kordo, detekto de superfluo dependas de la konduto de iuj rutinoj en la loka C-biblioteko, do ĝi devus esti rigardata kiel nefidinda. En ĉiu kazo, entjera superfluo kaj subfluo ĝenerale ne detektas fidinde por interaj rezultoj. Surfluaj punktoj superfluas kaj malfluaj estas detektitaj al la grado subtenata de la aparataro, kiu ĝenerale estas sufiĉe fidinda.

Konvertiĝo inter internaj reprezentoj por entjero, flospunkto kaj kordoj estas aŭtomate farita kiel necese. Por aritmetikaj komputiloj, (entjeroj, entjeras) estas uzita ĝis iu flospunkta nombro estas enmetita, post kiu flospunkto estas uzita. Ekzemple,

expr 5/4

revenas 1, dum

expr 5 / 4.0 expr 5 / ([kordo longo "abcd"] + 0.0)

ambaŭ revenos 1.25. Volaj valoroj ĉiam estas revenitaj per `` .e por ke ili ne aspektos kiel entjeraj valoroj. Ekzemple,

expr 20.0 / 5.0

revenas 4.0 , ne 4 .

Stringaj Operacioj

Stringaj valoroj povas esti uzataj kiel operandoj de la komparaj operatoroj, kvankam la esprima taksilo provas fari komparojn kiel entjeron aŭ flospunkton kiam ĝi povas. Se unu el la operandoj de komparo estas ŝnuro kaj la alia havas nombran valoron, la nombra opero estas revertita al ĉeno uzante la formato C sprintf- formato % d por entjeroj kaj % g por flospunaj valoroj. Ekzemple, la ordonoj

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

ambaŭ reveno 1. La unua komparo fariĝas uzanta komparo, kaj la dua fariĝas per komparata komando post kiam la dua operacio konvertiĝas al la ĉeno 18 . Pro la tendenco de Tcl trakti valorojn kiel nombrojn kiam ajn eblas, ĝenerale ne estas bona ideo uzi telefonistojn kiel == kiam vi vere volas komparon de ŝnuroj kaj la valoroj de la operandoj eblus arbitraj; estas pli bone en ĉi tiuj kazoj uzi la komandan ĉenon anstataŭe.

Konsideroj

Enmetu esprimojn en krampoj por la plej bona rapideco kaj la plej malgrandaj stokaj postuloj. Ĉi tio permesas al la komponaĵilo de Tcl-bittekston generi la plej bonan kodon.

Kiel menciita supre, esprimoj estas anstataŭigitaj dufoje: unufoje per la Tcl-analizilo kaj unufoje per la ekskribo . Ekzemple, la ordonoj

starigu 3-a aro b {$ a + 2} expr $ b * 4

revenu 11, ne multoblaj de 4. Ĉi tio estas ĉar la Tcl-analizilo unue anstataŭos $ a + 2 por la variablo b , tiam la ekspra komando taksos la esprimon $ a + 2 * 4 .

Plej multaj esprimoj ne postulas duan rondon de anstataŭigoj. Aŭ ili estas fermitaj en krampoj aŭ, se ne, iliaj variabloj kaj komandaj anstataŭaĵoj donas ciferojn aŭ kordoj, kiuj ne postulas anstataŭojn. Tamen, ĉar kelkaj nebrakataj esprimoj bezonas du ĉirkaŭvojojn de anstataŭigoj, la bytekodila kompilo devas elsendi aldonajn instrukciojn por manipuli ĉi tiun situacion. La plej multekosta kodo estas postulita por nebracedaj esprimoj, kiuj enhavas anstataŭajn komandojn. Ĉi tiuj esprimoj devas esti efektivigitaj per generado de nova kodo ĉiufoje kiam la esprimo estas ekzekutita.

Ŝlosilvortoj

aritmetika, boolea , kompari, esprimo, mallaborema komparo

Grava: Uzu la komandon ( % viro ) por vidi kiel komando estas uzata en via komputilo.