Comando Linux / Unix: expr

Nom

expr - Avaluar una expressió

Sinopsi

expr arg ? arg arg ... ?

Concatenació de arg (afegint espais separadors entre ells), avalua el resultat com una expressió Tcl i retorna el valor. Els operadors permesos en expressions Tcl són un subconjunt dels operadors permesos en expressions C, i tenen el mateix significat i prioritat que els operadors C corresponents. Les expressions gairebé sempre produeixen resultats numèrics (valors enters o de coma flotant). Per exemple, l'expressió

expr 8.2 + 6

s'avalua a 14.2. Les expressions Tcl difereixen de les expressions C de la manera com s'especifiquen els operands. A més, les expressions Tcl admeten operands no numèrics i comparacions de cadena.

Operands

Una expressió Tcl consisteix en una combinació d'operands, operadors i parèntesis. Es pot utilitzar espai blanc entre els operands i els operadors i entre parèntesis; s'ignora la instrucció de l'expressió. Quan sigui possible, els operands s'interpreten com a valors enters. Els valors enters es poden especificar en decimal (el cas normal), en octal (si el primer caràcter de l'operant és 0 ), o en hexadecimal (si els dos primers caràcters de l'operant són 0x ). Si un operador no té un dels formats enters que s'indica més amunt, es tractarà com un número de punt flotant si és possible. Els números de coma flotant es poden especificar en qualsevol de les formes acceptades per un compilador C compatible amb ANSI (excepte que els sufixos F , F , L i L no es permeten a la majoria d'instal·lacions). Per exemple, tots els següents són números de coma flotant vàlids: 2.1, 3., 6e4, 7.91e + 16. Si no és possible una interpretació numèrica, un operant es deixa com una cadena (i només es pot aplicar un grup limitat d'operadors).

Els operands es poden especificar de qualsevol de les maneres següents:

[1]

Com un valor numèric, ja sigui enter o punt flotant.

[2]

Com a variable Tcl, amb notació $ estàndard. El valor de la variable s'utilitzarà com a operant.

[3]

Com una cadena inclosa en cometes dobles. L'analitzador d'expressions realitzarà alternatives de barra invertida, variables i comandes a la informació entre les cometes i utilitzarà el valor resultant com a operant.

[4]

Com una corda tancada en tirants. Els caràcters entre la clau oberta i la clau de tancament coincidents s'utilitzaran com a operand sense cap substitució.

[5]

Com un comandament Tcl tancat entre claudàtors. La comanda s'executarà i el seu resultat s'utilitzarà com a operant.

[6]

Com a funció matemàtica els arguments tenen alguna de les formes anteriors per als operands, com el pecat ($ x) . Vegeu a continuació una llista de funcions definides.

Quan les substitucions es produeixen més amunt (per exemple, dins de les cadenes de cotització), es realitzen amb les instruccions de l'expressió. Tanmateix, l'analizador de comandes pot haver realitzat una capa addicional de substitució abans de cridar al processador d'expressions. Com es descriu a continuació, normalment és millor incloure expressions en tirants per evitar que l'analitzador de comandaments realitzi substitucions sobre els continguts.

Per a alguns exemples d'expressions simples, suposem que la variable a té el valor 3 i la variable b té el valor 6. A continuació, l'ordre del costat esquerre de cadascuna de les línies a continuació produirà el valor en el costat dret de la línia:

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

Operadors

Els operadors vàlids es detallen a continuació, agrupats en ordre decreixent de prioritat:

- + ~!

Unary minus, unary plus, bit-wise NOT, logical NOT. Cap d'aquests operands es pot aplicar als operands de cordes, i NOT de bits només es pot aplicar als enters.

* /%

Multiplicar, dividir, restar. Cap d'aquests operands es pot aplicar als operands de cordes, i la resta es pot aplicar només als enters. La resta sempre tindrà el mateix signe que el divisor i un valor absolut més petit que el divisor.

+ -

Afegir i restar. Vàlid per a qualsevol operand numèric.

<< >>

Desplaçament esquerre i dret. Vàlid només per a operands sencers. Un canvi de dreta sempre propaga el bit de signe.

<> <=> =

Booleà menys, major, menor o igual, i major o igual. Cada operador produeix 1 si la condició és certa, 0 en cas contrari. Aquests operadors es poden aplicar a cadenes o operands numèrics, en aquest cas es fa servir la comparació de cadenes.

==! =

Booleà igual i no igual. Cada operador produeix un resultat zero / un. Vàlid per a tots els tipus d'operands.

&

Bisexuals I. Vàlid només per a operands sencers.

^

OR exclusiu bit-wise. Vàlid només per a operands sencers.

|

OR poc a poc. Vàlid només per a operands sencers.

&&

Lògica AND. Produeix un resultat si els dos operands són nuls, 0 o no. Vàlid només per operands booleans i numèrics (sencers o punt flotant).

||

OR lògic. Produeix un resultat 0 si ambdós operands són zero, 1 d'una altra manera. Vàlid només per operands booleans i numèrics (sencers o punt flotant).

x ? y : z

Si-llavors-else, as in C. Si x avalua a no zero, llavors el resultat és el valor de y . En cas contrari, el resultat és el valor de z . L'operant x ha de tenir un valor numèric.

Vegeu el manual C per obtenir més informació sobre els resultats obtinguts per cada operador. Tots els grups d' operadors binaris d' esquerra a dreta tenen el mateix nivell de precedència. Per exemple, l'ordre

expr 4 * 2 <7

retorna 0.

The && , || , i ?: els operadors tenen una "avaluació mandrosa", igual que en C, el que significa que els operands no s'avaluen si no són necessaris per determinar el resultat. Per exemple, al comandament

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

només un de [a] o [b] serà avaluat de debò, depenent del valor de $ v . Tingueu en compte, però, que això només és cert si l'expressió sencera està tancada amb claudàtors; en cas contrari, l'analitzador Tcl avaluarà tant [a] com [b] abans d'invocar l'ordre expr .

Funcions matemàtiques

Tcl admet les següents funcions matemàtiques en expressions:

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

abs ( arg )

Retorna el valor absolut de arg . Arg pot ser un enter o un punt flotant, i el resultat es torna en el mateix formulari.

acos ( arg )

Retorna l'arc cosí d' arg , en el rang [0, pi] radians. Arg ha d'estar dins del rang [-1,1].

asin ( arg )

Retorna l'arc seno de arg , en el rang [-pi / 2, pi / 2] radians. Arg ha d'estar dins del rang [-1,1].

atan ( arg )

Retorna l'arc tangent de arg , en el rang [-pi / 2, pi / 2] radians.

atan2 ( x, y )

Retorna l'arc tangent de i / x , en el rang [-pi, pi] radians. x i y no poden ser dos.

ceil ( arg )

Retorna el valor sencer més petit no menys que arg .

cos ( arg )

Retorna el cosinus de arg , mesurat en radians.

cosh ( arg )

Retorna el cosinus hiperbòlic de arg . Si el resultat provoca un desbordament, es torna un error.

doble ( arg )

Si arg és un valor flotant, retorna arg , d'una altra manera converteix arg en flotant i retorna el valor convertit.

exp ( arg )

Retorna l'exponencial de arg , definit com e ** arg . Si el resultat provoca un desbordament, es torna un error.

pis ( arg )

Retorna el major valor integral no major que arg .

fmod ( x, y )

Retorna la resta del punt flotant de la divisió de x per i . Si y és 0, es torna un error.

hipot ( x, y )

Calcula la longitud de la hipotenusa d'un triangle rectangle ( x * x + y * y ).

int ( arg )

Si arg és un valor enter, retorna arg , d'una altra manera converteix arg a l'enter per truncament i retorna el valor convertit.

registre ( arg )

Retorna el logaritme natural de arg . Arg ha de ser un valor positiu.

log10 ( arg )

Retorna el logaritme base 10 de arg . Arg ha de ser un valor positiu.

pow ( x, y )

Calcula el valor de x elevat a la potència y . Si x és negatiu, y ha de ser un valor enter.

rand ()

Retorna un número de coma flotant des de zero a menys d'un o, en termes matemàtics, el rang [0,1]. La llavor prové del rellotge intern de la màquina o es pot configurar manualment amb la funció srand.

ronda ( arg )

Si arg és un valor enter, torna arg , d'una altra manera converteix arg a l'enter per arrodoniment i retorna el valor convertit.

pecat ( arg )

Retorna el sinus de l' arg , mesurat en radians.

sinh ( arg )

Retorna el sinus hiperbòlic de l' arg . Si el resultat provoca un desbordament, es torna un error.

sqrt ( arg )

Retorna l'arrel quadrada de arg . Arg ha de ser no negatiu.

srand ( arg )

El arg , que ha de ser un enter, s'utilitza per restablir la llavor per al generador de nombres aleatoris. Retorna el primer número aleatori d'aquesta llavor. Cada intèrpret té la seva pròpia llavor.

bronzejat ( arg )

Retorna la tangent d' arg , mesura en radians.

Tanh ( arg )

Retorna la tangent hiperbòlica de l' arg .

A més d'aquestes funcions predefinides, les aplicacions poden definir funcions addicionals mitjançant Tcl_CreateMathFunc ().

Tipus, desbordament i precisió

Tots els càlculs interns que intervenen en enters es realitzen amb el tipus C llarg , i tots els càlculs interns que impliquen punt flotant es realitzen amb el tipus C doble . Quan es converteix una cadena a un punt flotant, es detecta el desbordament de l'exponent i es produeix un error Tcl. Per a la conversió a l'enter de la cadena, la detecció del desbordament depèn del comportament d'algunes rutines a la biblioteca C local, per la qual cosa s'hauria de considerar poc fiable. En qualsevol cas, el desbordament i el desbordament del nombre enter no es detecten de manera fiable per obtenir resultats intermedis. El desbordament i el desbordament de punts flotants es detecten al grau suportat pel maquinari, que generalment és força fiable.

La conversió entre representacions internes per operadors de sencers, de coma flotant i de cadena es realitza automàticament segons sigui necessari. Per als càlculs aritmètics, s'utilitzen nombres enters fins que s'introdueix un número de coma flotant, després del qual s'utilitza un punt flotant. Per exemple,

expr 5/4

torna 1, mentre que

expr 5 / 4.0 expr 5 / ([longitud de la cadena "abcd"] + 0.0)

tots dos tornen 1.25. Els valors del punt flotant sempre es tornen amb un `` . '' o un e perquè no semblin valors enters. Per exemple,

expr 20.0 / 5.0

torna 4.0 , no 4 .

Operacions de cadena

Els valors de cadena es poden utilitzar com a operands dels operadors de comparació, tot i que l'avaluador d'expressions intenta fer comparacions com a número sencer o punt flotant quan pot. Si un dels operands d'una comparació és una cadena i l'altre té un valor numèric, l'operant numèric es converteix de nou en una cadena utilitzant el especificador de format Sprintf C % d per enters i % g per als valors de punt flotant. Per exemple, les ordres

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

ambdós retornen 1. La primera comparació es fa utilitzant la comparació d'enters, i la segona es fa utilitzant la comparació de cordes després que el segon operant es converteixi a la cadena 18 . A causa de la tendència de Tcl a tractar els valors com a nombres sempre que sigui possible, en general no és una bona idea utilitzar operadors com == quan realment desitgeu comparar la cadena i els valors dels operands podrien ser arbitraris; és millor en aquests casos utilitzar l'ordre de cadena .

Consideracions sobre el rendiment

Incloeu expressions en tirants per obtenir la millor velocitat i els requisits d'emmagatzematge més petits. Això permet que el compilador de bytecode Tcl generi el millor codi.

Com es va esmentar anteriorment, les expressions es substitueixen dues vegades: una vegada per l'analitzador Tcl i una vegada per l'ordre expr . Per exemple, les ordres

estableixi un conjunt de 3 b {$ a + 2} expr $ b * 4

torna 11, no un múltiple de 4. Això es deu a que l'analitzador Tcl substituirà primer a $ a + 2 per la variable b , llavors l'ordre expr avaluarà l'expressió $ a + 2 * 4 .

La majoria de les expressions no requereixen una segona ronda de substitucions. Estan tancades amb claus o, si no, les seves substitucions variables i de comandament produeixen números o cadenes que no necessiten substitucions per si mateixes. No obstant això, perquè algunes expressions no obertes necessiten dues rondes de substitucions, el compilador bytecode ha d'emetre instruccions addicionals per fer front a aquesta situació. El codi més car és necessari per a expressions no obertes que continguin substitucions de comandaments. Aquestes expressions s'han d'implementar generant un codi nou cada vegada que s'executa l'expressió.

Paraules clau

aritmètica, booleana , comparació, expressió, comparació difusa

Important: utilitzeu l'ordre man ( % home ) per veure com s'utilitza una comanda a l'ordinador en particular.