Nimi
expr - Arvioi lauseke
tiivistelmä
expr arg ? arg arg … ?
ketjuttaa arg (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ää desimaaliluvulla (normaalissa tapauksessa), oktaalissa (jos operandin ensimmäinen merkki on0) tai heksadesimaalisesti (jos operandin kaksi ensimmäistä merkkiä ovat0x). 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, F, l, jaL jälkipäät 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 käyttäen standardia$ merkintää. 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 edellä mainituista muodoista operandille, kutensin ($ x). Alla on lueteltu määritellyt toiminnot.
Jos substituutioita esiintyy edellä (esimerkiksi 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 muuttuja on arvo 3 ja muuttujabon arvo 6. Jokaisen alla olevan rivin vasemmalla puolella oleva komento tuottaa arvon rivin oikealla puolella:
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
Jos-sitten-muu, kuten kohdassa C. Jos x arvioi nollaksi, niin tulos on arvo y . Muutoin tulos on arvo z . 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?: operaattoreilla on "laiska arviointi", aivan kuten C: ssä, mikä tarkoittaa, että operandeja ei arvioida, jos niitä ei tarvita tuloksen määrittämiseen. Esimerkiksi komennossa
expr {$ v? a: b}
vain yksiA taiB tosiasiallisesti arvioidaan, riippuen arvosta$ v. Huomaa kuitenkin, että tämä on totta vain, jos koko ilmentymä on suljettu rintasyöpää; muuten Tcl-jäsennin arvioi molemmatA jaB ennen kuin vedotenexpr komento.
Matemaattiset toiminnot
Tcl tukee seuraavia matemaattisia funktioita lausekkeissa:
abs nuijalokisqrt acos kaksinkertainenlog10SRAND ASIN expsotavankirusketus rusketus lattiaRandtanh ATAN2 fmodpyöristää katosta hypotsynti cos intsinh
abs ( arg )
Palauttaa arvon absoluuttisen arvon arg . arg voi olla joko kokonaisluku tai kelluva piste ja tulos palautetaan samassa muodossa.
ACOS ( arg )
Palauttaa arg , alueella 0, pi radiaaneja. arg tulisi olla alueella -1,1.
ASIN ( arg )
Palauttaa kaaren sine arg , alueella -pi / 2, pi / 2 radiaania. arg tulisi olla alueella -1,1.
rusketus( arg )
Palauttaa kaaren tangentin arg , alueella -pi / 2, pi / 2 radiaania.
ATAN2 ( x, y )
Palauttaa kaaren tangentin y / x , alueella -pi, pi radiaaneilla. x ja y ei voi molemmat olla 0.
ceil ( arg )
Palauttaa pienimman kokonaislukuarvon vähintään arg .
cos ( arg )
Palauttaa arg , mitattuna radiaaneissa.
cosh ( arg )
Palauttaa hyperbolisen kosinin arg . Jos tulos aiheuttaisi ylivirtauksen, virhe palautetaan.
kaksinkertainen( arg )
Jos arg on kelluva arvo, palaa arg muuten muunnetaan arg kellumaan ja palauttaa muunnetun arvon.
exp ( arg )
Palauttaa eksponentiaalisen arg , määritelty e ** arg . Jos tulos aiheuttaisi ylivirtauksen, virhe palautetaan.
lattia( arg )
Palauttaa suurimman integraalin arvon, joka ei ole suurempi kuin arg .
fmod ( x, y )
Palauttaa leijuveden jäljellä olevan jakauman x mennessä y . Jos y on 0, virhe palautetaan.
hypot ( x, y )
Laskee suorakulmionmuotoisen kolmion hypotenusteen pituuden ( x * x + y * y ).
int ( arg )
Jos arg on kokonaislukuarvo, palaa arg muuten muunnetaan arg kokonaislukuun katkaisemalla ja palauttaa muunnetun arvon.
log ( arg )
Palauttaa arvon luonnollisen logaritmin arg . arg on oltava positiivinen.
log10 ( arg )
Palauttaa tukiaseman 10 logaritmin arg . arg on oltava positiivinen.
pow ( x, y )
Laskee arvon x nousee valtaan y . Jos x on negatiivinen, y 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.
pyöristää( arg )
Jos arg on kokonaislukuarvo, palaa arg muuten muunnetaan arg kokonaislukuun pyöristämällä ja palauttaa muunnetun arvon.
synti( arg )
Palauttaa arg , mitattuna radiaaneissa.
sinh ( arg )
Palauttaa hyperbolisen sinin arg . Jos tulos aiheuttaisi ylivirtauksen, virhe palautetaan.
sqrt ( arg )
Palauttaa arg . arg 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 tangentin arg , mitattuna radiaaneissa.
tanh ( arg )
Palauttaa hyperbolisen tangentin arg .
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 C-tyypillä pitkä , ja kaikki sisäiset laskutoimitukset, joissa on liukuluku, tehdään C-tyypin kanssa kaksinkertainen . 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 / (merkkijono pituus "abcd" + 0,0)
molemmat palaavat 1,25. Floating-point-arvot palautetaan aina ``.'' taie niin että ne eivät näytä kokonaislukuarvolta. Esimerkiksi,
expr 20,0 / 5,0
tuotto4.0, ei4.
String-toiminnot
String-arvoja voidaan käyttää vertailuoperaattoreiden operandiin, vaikka ilmaisuarvioija yrittää tehdä vertailuja kokonaislukuna tai kelluvan pisteenä, kun se on mahdollista. Jos yksi vertailun operandista on merkkijono ja toinen on numeerinen arvo, numeerinen operandi muunnetaan takaisin merkkijonoon käyttäen C sprintf formaatin määrittäjä% d kokonaislukuja ja% g kelluvia pisteitä varten. Esimerkiksi komennot
expr {"0x03"> "2"} expr {"0y" <"0x12"}
molemmat palaavat 1. Ensimmäinen vertailu suoritetaan käyttämällä kokonaisluvun vertailua ja toinen tehdään käyttämällä merkkijonon vertailua sen jälkeen, kun toinen operandi on muunnettu merkkijonoksi18. Koska Tcl: n taipumus käsitellä arvoja numeroina aina, kun se on mahdollista, ei yleensä ole hyvä käyttää käyttäjiä kuten==kun todella haluat merkkijonon vertailun ja operandien arvot voivat olla mielivaltaisia; se on parasta käyttää näissä tapauksissajono komennon sijaan.
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 expr komento. Esimerkiksi komennot
aseta 3 asettaa b {$ a + 2} expr $ b * 4
palaa 11, ei moninkertaista 4: ää. Tämä johtuu siitä, että Tcl-parser korvataan ensin$ a + 2 muuttujalleb, sittenexpr 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ä mies komento ( % mies ), miten komentoa käytetään tietyssä tietokoneessa.