Linux / Unix Command: expr

naam

expr - Evalueer 'n uitdrukking

opsomming

expr arg ? arg arg ... ?

Gekombineer args (voeg skeidingsruimtes tussen hulle by), evalueer die resultaat as 'n Tcl uitdrukking en gee die waarde terug. Die operateurs toegelaat in Tcl uitdrukkings is 'n deelversameling van die operateurs toegelaat in C uitdrukkings, en hulle het dieselfde betekenis en voorrang as die ooreenstemmende C-operateurs. Uitdrukkings lewer byna altyd numeriese resultate (heelgetalle of swaaipuntwaardes). Byvoorbeeld, die uitdrukking

expr 8.2 + 6

evalueer na 14.2. Tcl uitdrukkings verskil van C uitdrukkings in die manier waarop die operands gespesifiseer word. Tcl ondersteun ook nie-numeriese operands en string vergelykings.

operande

'N Tcl-uitdrukking bestaan ​​uit 'n kombinasie van operande, operateurs en hakies. Wit spasie kan tussen die operande en operateurs en hakies gebruik word; Dit word geïgnoreer deur die uitdrukking se instruksies. Waar moontlik word operande geïnterpreteer as heelgetalwaardes. Heelwaardes kan in desimale (die normale geval), in oktaal (indien die eerste karakter van die operand is 0 ), of in heksadesimale (indien die eerste twee karakters van die operand 0x is ) gespesifiseer word. As 'n operand nie een van die integerformate hierbo het nie, word dit as 'n drywingsnommer beskou as dit moontlik is. Vlotpuntgetalle kan op enige van die maniere wat deur 'n ANSI-voldoenende C-samesteller aanvaar word, behalwe dat die f , F , l en L- agtervoegsels nie in die meeste installasies toegelaat sal word nie. Byvoorbeeld, al die volgende is geldige drywingsgetalle: 2.1, 3., 6e4, 7.91e + 16. As geen numeriese interpretasie moontlik is nie, word 'n operand as 'n string oorgebly (en slegs 'n beperkte stel operateurs mag daarop toegepas word).

Operande kan op enige van die volgende maniere gespesifiseer word:

[1]

As 'n numeriese waarde, óf heelgetal of swewende punt.

[2]

As 'n Tcl veranderlike, gebruik standaard $ notasie. Die veranderlike se waarde sal as operand gebruik word.

[3]

As 'n toutjie ingesluit in dubbele aanhalingstekens. Die uitdrukking parser sal terugslag, veranderlike en opdrag vervangings op die inligting tussen die aanhalings uitvoer, en gebruik die gevolglike waarde as die operand

[4]

As 'n tou wat in hakies omring word. Die karakters tussen die oophaksel en die ooreenstemmende sluithakies sal as die operand gebruik word sonder enige vervangings.

[5]

As 'n TCL opdrag tussen hakies. Die opdrag sal uitgevoer word en die resultaat sal as operand gebruik word.

[6]

As 'n wiskundige funksie waarvan die argumente enige van die bogenoemde vorms het vir operande, soos sonde ($ x) . Sien hieronder vir 'n lys van gedefinieerde funksies.

Waar substitusies hierbo voorkom (bv. Binne genoteerde stringe), word hulle uitgevoer deur die uitdrukking se instruksies. 'N Bykomende laag vervanging kan egter reeds deur die bevelparser uitgevoer word voordat die uitdrukkingsverwerker geroep is. Soos hieronder bespreek, is dit gewoonlik die beste om uitdrukkings in hakies by te voeg om te verhoed dat die opdragsparser substitusies op die inhoud uitvoer.

Vir enkele voorbeelde van eenvoudige uitdrukkings, veronderstel die veranderlike a het die waarde 3 en die veranderlike b het die waarde 6. Dan sal die opdrag aan die linkerkant van elk van die lyne hieronder die waarde aan die regterkant van die lyn lewer:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * [length "6 2"] 8 expr {{woord een} <"woord $ a"} 0

operateurs

Die geldige operateurs word hieronder gelys, gegroepeer in dalende volgorde van voorrang:

- + ~!

Unary minus, unêre plus, bietjie wys NIE, logies NIE. Geen van hierdie operande mag op string operands toegepas word nie, en bietjie wys NIE mag slegs op heelgetalle toegepas word nie.

* /%

Vermenigvuldig, verdeel, oorblywende. Geen van hierdie operande mag op stringoperasies toegepas word nie, en die res mag slegs op heelgetalle toegepas word. Die res sal altyd dieselfde teken hê as die verdeler en 'n absolute waarde kleiner as die verdeler.

+ -

Voeg by en trek af. Geldig vir enige numeriese operands.

<< >>

Links en regs skuif. Geldig slegs vir integer operands. 'N Regskof propageer altyd die tekenbietjie.

<> <=> =

Boole-minder, groter, minder as of gelyk, en groter as of gelyk. Elke operateur produseer 1 as die toestand waar is, 0 andersins. Hierdie operateurs kan op stringe sowel as numeriese operands toegepas word, in welke geval stringvergelyking gebruik word.

==! =

Boole-gelyke en nie gelyk nie. Elke operateur lewer 'n nul / een resultaat. Geldig vir alle operand tipes.

&

Bit-wise AND. Geldig slegs vir integer operands.

^

Bit-wise eksklusiewe OF. Geldig slegs vir integer operands.

|

Bit-wise OF. Geldig slegs vir integer operands.

&&

Logiese AND. Produseer 'n 1 resultaat as beide operande nie-nul is, 0 andersins. Geldig vir boolean en numeriese (heelgetalle of swaaipunt) slegs operand.

||

Logiese OF. Produseer 'n 0 resultaat as beide operande nul is, 1 andersins. Geldig vir boolean en numeriese (heelgetalle of swaaipunt) slegs operand.

x ? y : z

As-dan-anders, soos in C. As x evalueer na nie-nul, dan is die resultaat die waarde van y . Andersins, is die resultaat die waarde van z . Die x operand moet 'n numeriese waarde hê.

Sien die C-handleiding vir meer besonderhede oor die resultate wat deur elke operateur opgelewer word. Al die binêre operatore groepe links-na-regs binne dieselfde prioriteitsvlak. Byvoorbeeld, die opdrag

expr 4 * 2 <7

opgawes 0.

Die && , || , en ?: Operateurs het `` lui evaluering '', net soos in C, wat beteken dat operande nie geëvalueer word as hulle nie nodig is om die uitslag te bepaal nie. Byvoorbeeld, in die opdrag

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

slegs een van [a] of [b] sal eintlik geëvalueer word, afhangende van die waarde van $ v . Let egter daarop dat dit net waar is as die hele uitdrukking in hakies ingesluit is; Anders sal die Tcl parser beide [a] en [b] evalueer voordat die expr- opdrag aangewend word .

Wiskundige funksies

Tcl ondersteun die volgende wiskundige funksies in uitdrukkings:

abs cosh log sqrt acos dubbel log10 srand asin exp pow tan atan vloer rand tanh atan2 fmod ronde plafon hipot sin cos int sinh

abs ( arg )

Wys die absolute waarde van arg . Arg kan óf heelgetal of swaaipunt wees, en die resultaat word in dieselfde vorm teruggestuur.

acos ( arg )

Wys die boogkusinus van arg , in die reeks [0, pi] radiale. Arg behoort in die reeks [-1,1] te wees.

asin ( arg )

Wys die boog sinus van arg , in die reeks [-pi / 2, pi / 2] radiale. Arg behoort in die reeks [-1,1] te wees.

atan ( arg )

Wys die boog tangens van arg , in die reeks [-pi / 2, pi / 2] radiale.

atan2 ( x, y )

Wys die boog raaklyn van y / x , in die reeks [-pi, pi] radiale. x en y kan nie albei 0 wees nie.

ceil ( arg )

Wys die kleinste heelgetalwaarde nie minder nie as arg .

cos ( arg )

Wys die cosinus van arg , gemeet in radiale.

cosh ( arg )

Wys die hiperboliese cosinus van arg . As die resultaat 'n oorloop sou veroorsaak, word 'n fout terugbesorg.

dubbel ( arg )

As arg 'n drywende waarde is, word optrede afgeleef , anders word arg om te dryf en word die omgeskakelwaarde terug.

exp ( arg )

Wys die eksponensiële van arg , gedefinieer as e ** arg . As die resultaat 'n oorloop sou veroorsaak, word 'n fout terugbesorg.

vloer ( arg )

Wys die grootste integrale waarde nie groter as arg nie .

fmod ( x, y )

Wys die swaaipuntresidu van die deling van x deur y . As y 0 is, word 'n fout teruggegee.

hipot ( x, y )

Bereken die lengte van die skuinssy van 'n reghoekige driehoek ( x * x + y * y ).

int ( arg )

As arg 'n heelgetalwaarde is, word optrede afgeleef , anders word arg na integer omgeskakel en word die omgeskakelwaarde terug.

log ( arg )

Wys die natuurlike logaritme van arg . Arg moet 'n positiewe waarde wees.

log10 ( arg )

Wys die basis 10 logaritme van arg . Arg moet 'n positiewe waarde wees.

pow ( x, y )

Bereken die waarde van x wat opgeneem word na die krag y . As x negatief is, moet y 'n heelgetalwaarde wees.

rand ()

Wys 'n drywingsnommer van nul tot net minder as een of, in wiskundige terme, die omvang [0,1]. Die saad kom van die interne klok van die masjien of kan 'n handleiding met die srand funksie wees.

rond ( arg )

As arg 'n heelgetalwaarde is, word optrede afgeleef , anders word arg na heelgetal omgeskakel deur afronding en gee die omgeskakelwaarde terug.

sonde ( arg )

Wys die sinus van arg , gemeet in radiale.

sinh ( arg )

Wys die hiperboliese sinus van arg . As die resultaat 'n oorloop sou veroorsaak, word 'n fout terugbesorg.

sqrt ( arg )

Wys die vierkantswortel van arg . Arg moet nie-negatief wees.

srand ( arg )

Die arg , wat 'n heelgetal moet wees, word gebruik om die saad vir die ewekansige genereerder te herstel. Wys die eerste ewekansige getal van die saad. Elke tolk het sy eie saad.

bruin ( arg )

Wys die raaklyn van arg , gemeet in radiale.

tanh ( arg )

Wys die hiperboliese raaklyn van arg .

Bykomend tot hierdie vooraf gedefinieerde funksies, kan toepassings addisionele funksies definieer met behulp van Tcl_CreateMathFunc ().

Tipes, oorvloei en presisie

Alle interne berekeninge wat heelgetalle behels, word met die C-tipe lank gedoen , en alle interne berekeninge wat swaaipunt behels, word met die C-tipe dubbel gedoen . Wanneer 'n string omskep word na swewende punt, word eksponentoorloop bespeur en word dit 'n Tcl-fout. Vir omskakeling na heelgetal van string, is opsporing van oorloop afhanklik van die gedrag van sommige roetines in die plaaslike C-biblioteek, dus dit moet as onbetroubaar beskou word. In elk geval word integeroorloop en ondervloei in die algemeen nie betroubaar vir intermediêre resultate opgespoor nie. Floating-punt oorloop en ondervloei word opgespoor tot die mate wat deur die hardeware ondersteun word, wat oor die algemeen redelik betroubaar is.

Omskakeling tussen interne voorstellings vir heelgetal, swaaipunt en snaaroperasies word outomaties gedoen soos benodig. Vir rekenkundige berekeninge word heelgetalle gebruik totdat 'n paar drywende punt nommer ingevoer word, waarna die swewende punt gebruik word. Byvoorbeeld,

expr 5/4

gee 1, terwyl

expr 5 / 4.0 expr 5 / ([string lengte "abcd"] + 0.0)

albei opbrengs 1.25. Swewende puntwaardes word altyd met 'n `` terugbesorg . '' of 'n e sodat hulle nie soos heelgetalle sal lyk nie. Byvoorbeeld,

expr 20.0 / 5.0

opgawes 4.0 , nie 4 nie .

String Operations

Stringwaardes kan gebruik word as operands van die vergelykingoperateurs, hoewel die uitdrukkingsevaluator probeer om vergelykings as heelgetal of swewende punt te doen wanneer dit kan. As een van die operands van 'n vergelyking 'n string is en die ander 'n numeriese waarde het, word die numeriese operand teruggeskakel na 'n string met die C sprintf- formaat spesifiseerder % d vir heelgetalle en % g vir swewende puntwaardes. Byvoorbeeld, die opdragte

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

albei opbrengs 1. Die eerste vergelyking word gedoen met behulp van integer vergelyking, en die tweede word gedoen met behulp van stringvergelyking nadat die tweede operand na die string 18 omgeskakel is. As gevolg van Tcl se neiging om waardes as getalle waar moontlik te behandel, is dit oor die algemeen nie 'n goeie idee om operateurs soos == te gebruik as jy regtig stringvergelyking wil hê nie en die waardes van die operands kan arbitrêr wees. In hierdie gevalle is dit beter om die snaaropdrag te gebruik.

Prestasie Oorwegings

Sluit uitdrukkings in hakies in vir die beste spoed en die kleinste bergingsvereistes. Dit laat die Tcl bytecode compiler toe om die beste kode te genereer.

Soos hierbo genoem, word uitdrukkings twee keer vervang: een keer deur die Tcl parser en een keer deur die expr bevel. Byvoorbeeld, die opdragte

stel 'n 3 stel b {$ a + 2} expr $ b * 4 in

retour 11, nie 'n veelvoud van 4. Dit is omdat die Tcl parser eers $ a + 2 vir die veranderlike b sal vervang , dan sal die ekspr- bevel die uitdrukking $ a + 2 * 4 evalueer.

Die meeste uitdrukkings vereis nie 'n tweede ronde substitusies nie. Of hulle is in hakies ingesluit of, indien nie, hul veranderlike en bevel vervangings lewer nommers of snare wat nie self vervangings vereis nie. Aangesien 'n paar ongevoerde uitdrukkings egter twee ronde substitusies benodig, moet die bytecode-samesteller addisionele instruksies uitstuur om hierdie situasie te hanteer. Die duurste kode word benodig vir ongeprogrammeerde uitdrukkings wat opdragte vervang. Hierdie uitdrukkings moet geïmplementeer word deur nuwe kode te genereer elke keer as die uitdrukking uitgevoer word.

sleutelwoorde

rekenkundige, boolean , vergelyk, uitdrukking, vals vergelyking

Belangrik: Gebruik die man opdrag ( % man ) om te sien hoe 'n opdrag op u rekenaar gebruik word.