Linux / Unix komanda: expr

vardas

expr - vertinti frazę

Anotacija

expr arg ? Arg arg ... ?

Derina arg 's (tarp jų pridedant skirtukus tarpų), vertina rezultatą kaip Tcl išraišką ir grąžina vertę. Tcl išraiškos leidžiami operatoriai yra C parašų leidžiamų operatorių pogrupis, ir jie turi tą pačią reikšmę ir pirmenybę, kaip ir atitinkami C operatoriai. Išraiškos beveik visuomet duoda skaitinius rezultatus (sveikuosius ar slankiosios vertės taškus). Pavyzdžiui, išraiška

Expr 8.2 + 6

įvertina iki 14,2. Tcl išraiškos skiriasi nuo C raiškos taip, kaip nurodomi operandai. Be to, Tcl išraiškos palaiko ne skaitinius operandus ir styginių palyginimus.

Operandai

Tcl išraišką sudaro operandų, operatorių ir skliaustų derinys. Tarp operandų ir operatorių ir skliausteliuose gali būti naudojama balta erdvė; tai ignoruojama išraiškos instrukcijose. Kur įmanoma, operandai interpretuojami kaip sveiki skaičiai. Integerų reikšmės gali būti nurodytos dešimtainėse (įprastai), octal (jei pirmoji operando reikšmė yra 0 ) arba šešioliktainis (jei pirmieji du operando simboliai yra 0x ). Jei operandas neturi vieno iš aukščiau nurodytų sveikojo skaičiaus formatų, tai yra laikoma slankaus taško skaičiumi, jei tai įmanoma. Plūduriuojančių taškų skaičiai gali būti nurodyti bet kuriuo būdu, kurį pripažįsta ANSI suderinamas C kompiliatorius (išskyrus tai, kad daugelyje įrenginių f , F , I ir L priesakos nebus leidžiamos). Pavyzdžiui, visi toliau nurodyti galiojantys slankiojo kablelio skaičiai: 2.1, 3., 6e4, 7.91e + 16. Jei skaitmeninis aiškinimas neįmanomas, operandas paliekamas kaip eilutė (ir jai gali būti taikomas tik ribotas operatorių rinkinys).

Operande galima nurodyti bet kuriuo iš šių būdų:

[1]

Kaip skaitmeninė reikšmė, arba sveikas skaičius ar kintamasis taškas.

[2]

Kaip Tcl kintamasis, naudojant standartinę $ žymėjimą. Kintamojo vertė bus naudojama kaip operandas.

[3]

Kaip eilutė, pridedama dvigubo kabučių. Parašas parserio metu atliks bakstelėjimo, kintamojo ir komandos keitimus tarp informacijos tarp citatų ir naudos gautą reikšmę kaip operandą

[4]

Kaip stygos, pridedamos petnešos. Tarp operacinės atramos ir atitikimo glaudžiai tvirtinimo ženklai bus naudojami kaip operandas be jokių pakeitimų.

[5]

Kaip komandą "Tcl" pridedama skliausteliuose. Komanda bus vykdoma, o jo rezultatas bus naudojamas kaip operandas.

[6]

Kaip matematinė funkcija, kurios argumentai turi bet kurią iš pirmiau nurodytų formų operandams, pavyzdžiui, sin ($ x) . Žemiau pateikiamas nustatytų funkcijų sąrašas.

Kai pakeitimai įvyksta aukščiau (pvz., Viduje kotiruojamos eilutės), jos vykdomos išraiškos nurodymų. Tačiau papildomas sluoksnio pakeitimas gali būti atliktas komandų analizatoriaus prieš išraiškos procesoriaus pavadinimą. Kaip aptarta toliau, dažniausiai geriausia pridėti raiškos į petnešeles, kad komandinis analizatorius negalėtų atlikti pakeitimų turiniu.

Kalbant apie kai kurių paprastų išraiškų pavyzdžius, tarkime, kad kintamasis a turi 3 reikšmę, o kintamasis b turi reikšmę 6. Tada kiekvienos iš žemiau pateiktų eilučių kairėje pusėje pateikta komanda parodys reikšmę dešinėje linijos pusėje:

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

Operatoriai

Toliau nurodyti galiojantys operatoriai, suskirstyti į mažėjančią pirmumo eilę:

- + ~!

Unary minus, unary plus, bit-wise NOT, logical NOT. Nė vienas iš šių operandų negali būti taikomas styginių operandams, o truputį NE. Gali būti taikomas tik sveikiems skaičiams.

* /%

Padauginkite, padalykite, likusi dalis. Nė vienas iš šių operandų negali būti taikomas styginių operandams, o likusieji gali būti taikomi tik sveikiems skaičiams. Likusi dalis visada turės tą patį ženklą, kaip ir daliklis, o absoliutinė vertė yra mažesnė nei daliklis.

+ -

Pridėti ir atimti. Galioja bet kokiems skaitiniams operandams.

<< >>

Kairysis ir dešinysis poslinkis. Galioja tik sveikiis skaičiavimams. Tiesinysis poslinkis visada platina ženklą.

<> <=> =

Būlio mažesnis, didesnis, mažesnis arba lygus ir didesnis arba lygus. Kiekvienas operatorius gamina 1, jei sąlyga yra teisinga, 0 kitaip. Šie operatoriai gali būti naudojami styginiams, taip pat skaitiniams operandams, tokiu atveju naudojamas styginių palyginimas.

==! =

Būlio lygus ir ne lygus. Kiekvienas operatorius duoda rezultatą nulis / vienas. Galioja visiems operandų tipams.

&

Bjaurus ir. Galioja tik sveikiis skaičiavimams.

^

Išmintingas išimtinis ARBA. Galioja tik sveikiis skaičiavimams.

|

Truputį OR. Galioja tik sveikiis skaičiavimams.

&&

Logiška ir. Gamina 1 rezultatą, jei abu operandai yra ne nuliniai, 0 kitaip. Galioja tik biuleteniams ir skaitiniams (sveiki ar skaičiuojantys taškai) operandai.

||

Logiškas OR. Gamina 0 rezultatą, jei abu operandai yra nuliniai, 1 kitaip. Galioja tik biuleteniams ir skaitiniams (sveiki ar skaičiuojantys taškai) operandai.

x ? y : z

Jei-tada-kitas, kaip ir C. Jei x vertinamas ne nuliui, rezultatas yra y reikšmė. Priešingu atveju rezultatas yra z reikšmė. X operandui turi būti skaitinė reikšmė.

Daugiau informacijos apie kiekvieno operatoriaus pateiktus rezultatus rasite C vadove. Visa dvejetainių operatorių grupė iš kairės į dešinę per tą patį prioriteto lygį. Pavyzdžiui, komanda

expr 4 * 2 <7

grąžina 0.

&& , || , ir ?: operatoriai turi "tinginį įvertinimą", kaip ir C, o tai reiškia, kad operandai nėra įvertinami, jei jie nėra reikalingi rezultatams nustatyti. Pavyzdžiui, komandoje

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

Tik vienas iš [a] arba [b] iš tikrųjų bus įvertintas, priklausomai nuo vertės $ v . Tačiau atkreipkite dėmesį, kad tai yra tik tiesa, jei visa frazė yra uždėta į petnešomis; priešingu atveju Tcl analizatorius įvertins tiek [a], tiek [b], prieš pradedant naudoti expr komandą.

Matematikos funkcijos

Tcl palaiko šias matematines funkcijas išraiškose:

abs cosh log sqrt acos double log10 srand asin exp pow tan atan floor rand tanh atan2 fmod apvali ceil hypot sin cos int sinh

abs ( arg )

Grąžina absoliučią arg vertę. Arg gali būti sveikasis ar kintamasis taškas, o rezultatas grąžinamas ta pačia forma.

acos ( arg )

Grąžina arko cosinusą arg , diapazone [0, pi] radians. Arg turi būti diapazone [-1,1].

asin ( arg )

Grąžina lanko sine iš arg , intervalo [-pi / 2, pi / 2] radianų. Arg turi būti diapazone [-1,1].

atan ( arg )

Grąžina lanko tangentą arg , diapazone [-pi / 2, pi / 2] radianais.

atan2 ( x, y )

Grąžina lanko tangentą iš y / x intervalo [-pi, pi] radianų. x ir y negali abu būti 0.

Ceil ( arg )

Grąžina mažiausią sveikojo skaičiaus reikšmę ne mažiau kaip arg .

cos ( arg )

Grąžina " arg" kosiną , išmatuotą radianais.

cosh ( arg )

Grąžina hiperbolinį kosiną arg . Jei rezultatas sukeltų perpildymą, grąžinama klaida.

dvigubas ( arg )

Jei arg yra kintama vertė, grąžina arg , kitaip konvertuoja arg į kintamą ir grąžina konvertuotą vertę.

exp ( arg )

Grąžina ekspoziciją arg , apibrėžiamą kaip e ** arg . Jei rezultatas sukeltų perpildymą, grąžinama klaida.

grindys ( arg )

Grąžina didžiausią integruotą vertę, ne didesnę kaip arg .

fmod ( x, y )

Grąžina kintamojo taško likusį x padalijimą iš y . Jei y yra 0, grąžinama klaida.

hipoteka ( x, y )

Apskaičiuojamas kampo trikampio ( x * x + y * y ) hypotenuse ilgis.

int ( arg )

Jei arg yra sveikasis skaičius, grąžina arg , kitaip konvertuoja arg į sveiką skaičių trintimi ir grąžina konvertuotą vertę.

Prisijungti ( arg )

Grąžina arg algoritmą . Arg turi būti teigiamas.

log10 ( arg )

Grąžina pagrindą 10 logaritmo arg . Arg turi būti teigiamas.

pow ( x, y )

Apskaičiuojama x vertė padidinama iki galios y . Jei x yra neigiamas, y turi būti sveikas skaičius.

rand ()

Grąžina slankiojo kablelio skaičių nuo nulio iki maždaug vienos arba, matematiškai, diapazono [0,1]. Sėkla gaunama iš vidinio mašinos laikrodžio arba gali būti nustatytas rankiniu būdu su funkcija "srand".

apvalus ( arg )

Jei arg yra sveikasis skaičius, grąžina arg , kitaip konvertuoja arg į sveiką skaičių apvalinant ir grąžina konvertuotą vertę.

nuodėmė ( arg )

Grąžina argą siną , išmatuotą radianais.

sinh ( arg )

Grąžina argo hiperbolinę siną . Jei rezultatas sukeltų perpildymą, grąžinama klaida.

sqrt ( arg )

Grąžina kvadratinę šakną iš arg . Arg turi būti neigiamas.

srand ( arg )

Arg , kuris turi būti sveikasis skaičius, naudojamas atsitiktinių skaičių generatoriaus sėklai iš naujo nustatyti. Grąžina pirmąjį atsitiktinį skaičių iš šios sėklos. Kiekvienas vertėjas turi savo sėklą.

tan ( arg )

Grąžina argą , apskaičiuotą radianais, tarpe.

tanh ( arg )

Grąžina hiperbolinį arg argumentą .

Be šių iš anksto nustatytų funkcijų, programos gali apibrėžti papildomas funkcijas naudojant Tcl_CreateMathFunc ().

Tipai, perpildymas ir tikslumas

Visi vidiniai skaičiavimai, kuriuose yra sveikieji skaičiai, atliekami su C tipo ilgiu , o visi vidiniai skaičiavimai su slankiojo kablelio skaičiumi atliekami naudojant C tipo dvigubą . Kai konvertuojame eilutę į slankiojo kablelio tašką, aptikta eksponentų perpildymas ir sukelia Tcl klaidą. Norėdami konvertuoti į sveiką skaičių iš eilutės, perpildymo aptikimas priklauso nuo kai kurių įprastų elgesio vietos C bibliotekoje, todėl jis turėtų būti laikomas nepatikimu. Bet kokiu atveju, sveiki perpildymai ir nutekėjimas paprastai nėra patikimai nustatyti tarpiniams rezultatams. Plūduriuojančio taško perpildymas ir nutekėjimas nustatomas pagal techninės įrangos lygį, kuris paprastai yra gana patikimas.

Konvertavimas tarp vidinių parodymų už sveikas, slankiojo kablelio ir styginių operandų atliekamas automatiškai, kai reikia. Iš aritmetinių skaičiavimų naudojami sveikieji skaičiai, kol įvedamas kai kurių slankiojo kablelio skaičius, po kurio naudojamas slankaus taškas. Pavyzdžiui,

Expr 5/4

grąžina 1, o

expr 5 / 4.0 expr 5 / ([eilutės ilgis "abcd"] + 0.0)

abu grąžina 1,25. Kintamos taško vertės visada grąžinamos su `` . '' arba e taip, kad jie nebūtų atrodo kaip sveiki reikšmės. Pavyzdžiui,

expr 20.0 / 5.0

grąžina 4,0 , o ne 4 .

Styginių operacijos

Styginių reikšmės gali būti naudojamos kaip palyginimų operatorių operandai, nors išraiškos vertintojas bando atlikti palyginimus kaip sveikuosius ar kintamuosius taškus. Jei vienas iš palyginimo operandų yra eilutė, o kita - skaitine verte, skaitinis operandas yra konvertuojamas atgal į eilutę, naudojant C sprintf formato specifiku % d - sveikiis skaičiais ir % g - slankiojo kablelio vertes. Pavyzdžiui, komandos

expr ("0x03"> "2") expr ("0y" <"0x12")

abu grąžina 1. Pirmasis palyginimas atliekamas naudojant skaičių palyginimą, o antrasis atliekamas naudojant eilučių palyginimą po to, kai antrasis operandas yra konvertuojamas į 18 eilutę. Dėl Tcl tendencijos vertinti vertes kaip skaičius, kai tik įmanoma, apskritai nėra tikslinga naudoti tokius operatorius kaip ==, kai tikrai norite, kad eilučių palyginimas ir operandų vertės būtų savavališkos; šiais atvejais geriau naudoti vietoj komandų eilutę .

Veiklos aspektai

Pridėkite raiškos petnešose, kad būtų pasiektas geriausias greitis ir mažiausi saugojimo reikalavimai. Tai leidžia Tcl baitų kodo kompiliatoriui sugeneruoti geriausią kodą.

Kaip minėta pirmiau, išraiškos yra pakeistos du kartus: vieną kartą Tcl parserio ir vieną kartą expr komandą. Pavyzdžiui, komandos

nustatykite 3 rinkinį b ($ a + 2) expr $ b * 4

grįžti 11, o ne 4 kartų. Tai yra todėl, kad Tcl analizatorius pirmiausia pakeis $ a + 2 kintamojo b , tada komanda expr įvertins išraišką $ a + 2 * 4 .

Daugumai išraiškų nereikia antros pakopos pakeitimų. Arba jie pridedami į petnešomis, o jei ne, jų kintamieji ir komandų pakeitimai duoda skaičių arba eilutes, kurių pačios nereikia keisti. Tačiau dėl to, kad kelias neišspręstas išraiškas reikalauja dviejų pakaitų raundų, baitkodų kompiliatorius turi išleisti papildomas instrukcijas šiam atvejui įveikti. Brangiausias kodas reikalingas nepakeistoms išraiškoms, kuriose yra komandų pakeitimų. Šios išraiškos turi būti įgyvendintos generuojant naują kodą kiekvieną kartą, kai frazė yra įvykdyta.

Raktiniai žodžiai

aritmetinis, boolean , palyginimas, išraiška, neaiškus palyginimas

Svarbu: naudokite komandą man ( % man ), kad pamatytumėte, kaip komanda naudojama jūsų konkrečiame kompiuteryje.