Linux / Unix Command: expr

Nimi

expr - Arvioi lauseke

tiivistelmä

expr arg ? arg arg ... ?

Yhdistää arg : n (lisäämällä niiden väliset erotustilat), arvioi tuloksen Tcl-lausekkeena ja palauttaa arvon. Tcl-lausekkeissa sallitut operaattorit ovat C-lausekkeissa sallittujen toimijoiden osajoukko ja niillä on sama merkitys ja etuoikeus kuin vastaavat C-operaattorit. Ilmaisut tuottavat lähes aina numeerisia tuloksia (kokonaisluku tai kelluva piste). Esimerkiksi ilmaus

ekspr 8,2 + 6

arvioi 14,2. Tcl-lausekkeet poikkeavat C-lausekkeista tavalla, jolla operantit on määritetty. Myös Tcl-lausekkeet tukevat ei-numeerisia operandit ja merkkijonon vertailuja.

operandit

Tcl-ilmentymä koostuu operandien, operaattoreiden ja sulkujen yhdistelmästä. Valkoista tilaa voidaan käyttää operaatioiden ja operaattorien ja sulkujen välillä; sitä ei ole otettu huomioon lausekkeen ohjeissa. Operandit tulkitaan mahdollisuuksien mukaan kokonaislukuina. Integer-arvot voidaan määrittää desimaaliluvut (normaali tapaus), oktaali (jos operandin ensimmäinen merkki on 0 ) tai heksadesimaalinen (jos operandin kaksi ensimmäistä merkkiä ovat 0x ). Jos operandilla ei ole yhtä yllä mainituista kokonaislukuformaateista, sitä käsitellään lippaavan numerona, jos se on mahdollista. Kelluvat pistemäärät voidaan määrittää millä tahansa ANSI-yhteensopivan C-kääntäjän hyväksymällä tavalla (paitsi että f , L , L ja L- suffixit eivät ole sallittuja useimmissa asennuksissa). Esimerkiksi kaikki seuraavat ovat kelvollisia liukulukuisia numeroita: 2.1, 3., 6e4, 7.91e + 16. Jos numeerista tulkintaa ei ole mahdollista, operandi jätetään merkkijonoon (ja siihen voidaan soveltaa vain rajoitettua joukkoa operaattoreita).

Operandit voidaan määritellä jollakin seuraavista tavoista:

[1]

Numeerisena arvona joko kokonaisluku tai kelluva piste.

[2]

Tcl-muuttujana standardin $ notaation avulla. Muuttujan arvoa käytetään operandina.

[3]

Kaksinkertaisina lainausmerkkeinä suljettuina merkkijonoina. Ilmaisun jäsentimellä suoritetaan kiertokulku, muuttuja ja komennon korvaus tietueiden välillä, ja käytä tuloksena olevaa arvoa operandina

[4]

Kuten merkkijono suljetaan hanskassa. Avoimet haaran ja yhteensopivien sulkumerkkien välisiä merkkejä käytetään operandina ilman korvauksia.

[5]

Tcl-komennon sulkeissa. Komento suoritetaan ja sen tulosta käytetään operandina.

[6]

Matemaattisena funktiona, jonka argumentteilla on jokin yllä mainituista muodoista operandille, kuten sin ($ x) . Alla on lueteltu määritellyt toiminnot.

Jos korvaukset esiintyvät yllä (esim. Sisäisesti noteerattuja merkkijonoja), ne suoritetaan lausekkeen ohjeilla. Käskykomentaja on kuitenkin jo tehnyt ylimääräisen korvauskerroksen, ennen kuin ilmaisuprosessori kutsuttiin. Kuten jäljempänä selostetaan, on tavallisesti paras sulkea lausekkeet hammasratsastuksille estämään komentojen jäsentimen tekemästä korvauksia sisällöstä.

Joitakin esimerkkejä yksinkertaisista lausekkeista, oletetaan, että muuttujalla a on arvo 3 ja muuttujan b arvo on 6. Sitten kunkin alla olevan rivin vasemmalla puolella oleva komento tuo arvon rivin oikealle puolelle:

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

operaattorit

Seuraavassa on lueteltu pätevät toimijat, jotka on ryhmitelty alemmassa järjestyksessä:

- + ~!

Unary miinus, unary plus, bit-wise EI, looginen ei. Yksikään näistä operandeista ei voida soveltaa merkkijonooperandeihin, ja bittistä EI voidaan soveltaa vain kokonaislukuihin.

* /%

Kerro, jakaa, loput. Yksikään näistä operandeista ei voida soveltaa merkkijonon operandeihin, ja loput voidaan soveltaa vain kokonaislukuihin. Jäljellä olevilla on aina sama merkintä kuin jakajan ja absoluuttinen arvo pienempi kuin jakajan.

+ -

Lisää ja vähennä. Voidaan käyttää millä tahansa numeerisella operandilla.

<< >>

Vasen ja oikea siirtymä. Voidaan käyttää vain kokonaislukuoptereihin. Oikea siirtymä aina leviää merkkibitin eteen.

<> <=> =

Boolean pienempi, suurempi, pienempi tai yhtä suuri ja suurempi tai yhtä suuri. Jokainen operaattori tuottaa 1 jos ehto on tosi, 0 muuten. Näitä operaattoreita voidaan soveltaa merkkijonoihin sekä numeerisiin operandiin, missä tapauksessa käytetään merkkijonoa.

==! =

Boolen yhtäläinen ja ei yhtäläinen. Jokainen operaattori tuottaa nollan / yhden tuloksen. Voidaan käyttää kaikissa operandityypeissä.

&

Bit-viisas AND. Voidaan käyttää vain kokonaislukuoptereihin.

^

Bit-viisas yksinomainen OR. Voidaan käyttää vain kokonaislukuoptereihin.

|

Bit-viisas OR. Voidaan käyttää vain kokonaislukuoptereihin.

&&

Looginen AND. Tuo 1 tulos, jos molemmat operandit ovat ei-nolla, 0 muuten. Voimassa vain boolean ja numeeristen (kokonaislukujen tai kelluvien) operandien kanssa.

||

Looginen OR. Tuo 0 tulos, jos molemmat operandit ovat nolla, 1 muuten. Voimassa vain boolean ja numeeristen (kokonaislukujen tai kelluvien) operandien kanssa.

x ? y : z

If-then-else, kuten C: ssä. Jos x arvioi nollaksi, niin tulos on y: n arvo. Muuten tulos on z: n arvo. X- operandilla on oltava numeerinen arvo.

Katso C-käsikirjasta lisätietoja kunkin käyttäjän tuottamasta tuloksesta. Kaikki binäärioperaattoriryhmä vasemmalta oikealle samalla prioriteettitasolla. Esimerkiksi komento

expr 4 * 2 <7

palauttaa 0.

&& , || , ja ?: operaattorit ovat "laiska arviointi", kuten C: ssä, mikä tarkoittaa, että operandeja ei arvioida, jos niitä ei tarvita tuloksen määrittämiseen. Esimerkiksi komennossa

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

vain yhtä [a]: sta tai [b]: stä arvioidaan todellisuudessa, riippuen $ v : n arvosta. Huomaa kuitenkin, että tämä on totta vain, jos koko ilmentymä on suljettu rintasyöpää; muuten Tcl-jäsennin arvioi sekä [a] että [b] ennen kuin kutsutaan expr- komentoa.

Matemaattiset toiminnot

Tcl tukee seuraavia matemaattisia funktioita lausekkeissa:

abs cosh log sqrt acos kaksinkertainen log10 srand asin exp pow tan atan lattia rand tanh atan2 fmod pyöreä katto hypot sin cos int sinh

abs ( arg )

Palauttaa arg: n absoluuttisen arvon. Arg voi olla joko kokonaisluku tai kelluva piste, ja tulos palautetaan samassa muodossa.

acos ( arg )

Palauttaa arkin arc-kosinian alueella [0, pi] radiaania. Arg: n tulee olla alueella [-1,1].

asin ( arg )

Palauttaa arg- sine-arvon, joka on alueella [-pi / 2, pi / 2]. Arg: n tulee olla alueella [-1,1].

atan ( arg )

Palauttaa arg- tangentin arg- alueella, välillä [-pi / 2, pi / 2] radiaania.

atan2 ( x, y )

Palauttaa y / x: n kaaren tangentin alueella [-pi, pi] radiaaneilla. x ja y eivät voi molemmat olla 0.

katto ( arg )

Palauttaa pienimman kokonaislukuarvon, joka on vähintään arg .

cos ( arg )

Palauttaa arg: n cosiniin , joka mitataan radiaaneissa.

cosh ( arg )

Palauttaa argumentin hyperbolisen kosinin. Jos tulos aiheuttaisi ylivirtauksen, virhe palautetaan.

kaksinkertainen ( arg )

Jos arg on kelluva arvo, palauttaa arg , muuten muuntaa argin kellumaan ja palauttaa muunnetun arvon.

exp ( arg )

Palauttaa arg: n eksponentiaaliksi määriteltynä e ** arg . Jos tulos aiheuttaisi ylivirtauksen, virhe palautetaan.

lattia ( arg )

Palauttaa suurimman integraalin arvon, joka ei ole suurempi kuin arg .

fmod ( x, y )

Palauttaa x : n jakauman leijupisteen loppuosan y: llä . Jos y on 0, palautetaan virhe.

hypot ( x, y )

Laskee oikean viisteen kolmion ( x * x + y * y ) hypotenuus pituuden.

int ( arg )

Jos arg on kokonaislukuarvo, palaa arg , muuten muuntaa arg kokonaislukuun katkaisemalla ja palauttaa muunnetun arvon.

loki ( arg )

Palauttaa argumentin luonnollisen logaritmin. Arg: n täytyy olla positiivinen arvo.

log10 ( arg )

Palauttaa argumentin tukiaseman 10 logaritmi. Arg: n täytyy olla positiivinen arvo.

pow ( x, y )

Laskee arvon x nostettu teho y . Jos x on negatiivinen, y: n on oltava kokonaislukuarvo.

rand ()

Palauttaa kelluvan pisteen numeron nollasta vain alle yhteen tai matemaattisesti termiin [0,1]. Siemen tulee koneen sisäisestä kellosta tai se voidaan asettaa manuaalisesti srand-toiminnolla.

kierros ( arg )

Jos arg on kokonaislukuarvo, palaa arg , muuten muuntaa arg kokonaislukuun pyöristämällä ja palauttaa muunnetun arvon.

sin ( arg )

Palauttaa arg: n sinin, mitattuna radiaaneissa.

sinh ( arg )

Palauttaa argumentin hyperbolisen sine. Jos tulos aiheuttaisi ylivirtauksen, virhe palautetaan.

sqrt ( arg )

Palauttaa argumentin neliöjuuren. Arg: n on oltava ei-negatiivinen.

srand ( arg )

Arg , jonka on oltava kokonaisluku, käytetään satunnaislukugeneraattorin siementen nollaamiseen. Palauttaa ensimmäisen sattumanumeron kyseisestä siemenestä. Jokaisella tulkulla on oma siemenensä.

tan ( arg )

Palauttaa arg: n tangentin, mitattuna radiaaneissa.

tanh ( arg )

Palauttaa arg: n hyperbolisen tangentin.

Näiden ennalta määritettyjen toimintojen lisäksi sovellukset voivat määrittää lisätoimintoja käyttämällä Tcl_CreateMathFunc ().

Tyypit, ylivuoto ja tarkkuus

Kaikki sisäiset laskutoimitukset, joissa on kokonaislukuja, suoritetaan pitkällä C-tyypillä ja kaikki sisäiset laskutoimitukset, joissa on liukuluku, tehdään C-tyypin kaksinkertaisella . Kun muunnetaan merkkijono kelluvaan pisteeseen, eksponenttien ylivuoto havaitaan ja tuloksena on Tcl-virhe. Muuttumisesta kokonaislukuun merkkijonosta ylivuodon havaitseminen riippuu joidenkin rutiinien käyttäytymisestä paikallisessa C-kirjastossa, joten sitä on pidettävä epäluotettavana. Joka tapauksessa kokonaislukuvirtausta ja alivirtausta ei yleensä havaita luotettavasti välituloksille. Floating-point ylivuoto ja alivirtaus havaitaan sen mukaan, mikä laitteisto tukee, mikä on yleensä melko luotettavaa.

Sisäisten esitysmuotojen muuntaminen kokonaisluku-, liukuluku- ja merkkijonooperandien välillä suoritetaan automaattisesti tarpeen mukaan. Aritmeettisille laskutoimituksille käytetään kokonaislukuja, kunnes lisätään jokin kelluva piste, jonka jälkeen käytetään liukuluku. Esimerkiksi,

ekspr 5/4

palauttaa 1, kun taas

expr 5 / 4,0 expr 5 / ([merkkijonon pituus "abcd"] + 0,0)

molemmat palaavat 1,25. Floating-point-arvot palautetaan aina `` . '' tai e, niin että ne eivät näytä kokonaisluvulta. Esimerkiksi,

expr 20,0 / 5,0

palauttaa 4,0 , ei 4 .

String-toiminnot

String-arvoja voidaan käyttää vertailuoperaattoreiden operandiin, vaikka ilmaisuarvioija yrittää tehdä vertailuja kokonaislukuna tai kelluvan pisteenä, kun se on mahdollista. Jos yhden vertailun operaatiot ovat merkkijono ja toinen on numeerinen arvo, numeerinen operandi muunnetaan takaisin merkkijonoon käyttämällä C sprintf -muodon määrittäjää % d kokonaislukuja ja % g liukuluvuista arvoja varten. Esimerkiksi komennot

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

molemmat palaavat 1. Ensimmäinen vertailu suoritetaan käyttämällä kokonaislukuja ja toinen tehdään käyttämällä merkkijonon vertailua sen jälkeen, kun toinen operandi muunnetaan merkkijonoon 18 . Koska Tcl pyrkii käsittelemään arvoja numeroina aina kun se on mahdollista, ei yleensä ole hyvä idea käyttää operaattoreita kuten ==, kun todella haluat merkkijonon vertailua ja operandiarvot voivat olla mielivaltaisia; on parempi, että näissä tapauksissa käytetään merkkijonoa .

Suorituskyky huomioita

Kiinnitä lausekkeet hammaslistalle parhaan nopeuden ja pienimmän säilytysvaatimuksen mukaan. Tämä mahdollistaa Tcl-tavutekoodin kääntäjän tuottaa parhaan koodin.

Kuten yllä mainittiin, lausekkeet korvataan kahdesti: kerran Tcl-parserilla ja kerran ekspr komennolla. Esimerkiksi komennot

aseta 3 joukko b {$ a + 2} expr $ b * 4

palauttaa 11, ei 4: n monikerta. Tämä johtuu siitä, että Tcl-parser ensin korvaa $ a + 2 muuttujalle b , sitten expr- komento arvioi lausekkeen $ a + 2 * 4 .

Useimmat lausekkeet eivät edellytä toisen kierroksen korvaamista. Joko heidät on suljettu hammaslääkärille tai, jos ei, heidän muuttujansa ja komennonsa korvaavat tuotokset tai merkkijonot, jotka eivät itse edellytä korvauksia. Kuitenkin, koska muutamat epämääräiset lausekkeet tarvitsevat kaksi korvauskierrosta, tavutekoodi-kääntäjän on annettava lisäohjeita tilanteen hoitamiseksi. Kaikkein kalliimpia koodeja tarvitaan hylättyjä lausekkeita, jotka sisältävät komennon vaihtoja. Nämä lausekkeet on toteutettava luomalla uusi koodi aina, kun lauseke toteutetaan.

Avainsanat

aritmeettinen, looginen , vertailu, ilmaisu, sumea vertailu

Tärkeää: Käytä man- komentoa ( % man ) nähdäksesi kuinka komentoa käytetään tietyssä tietokoneessa.