Navn
expr - Evaluer et udtryk
Synopsis
expr arg ? arg arg … ?
sammenkæder arg s (tilføjer separatorrum mellem dem), evaluerer resultatet som et Tcl - udtryk og returnerer værdien. Operatørerne tilladt i Tcl-udtryk er en delmængde af operatørerne tilladt i C-udtryk, og de har samme betydning og forrang som de tilsvarende C-operatører. Udtryk giver næsten altid numeriske resultater (heltal eller flydende punktværdier). Eksempelvis udtrykket
expr 8.2 + 6
evaluerer til 14,2. Tcl udtryk adskiller sig fra C udtryk på den måde, som operanderne er angivet. Tcl-udtryk understøtter også ikke-numeriske operand- og streng-sammenligninger.
operander
Et Tcl udtryk består af en kombination af operander, operatører og parenteser. Hvidt rum kan anvendes mellem operanderne og operatørerne og parenteserne; det ignoreres af udtryks vejledning. Hvor det er muligt tolkes operander som heltal værdier. Integerværdier kan angives i decimal (det normale tilfælde), i oktal (hvis operandens første tegn er0) eller i hexadecimal (hvis de to første tegn i operand er0x). Hvis en operand ikke har et af de heltalformater, der er angivet ovenfor, behandles det som et flytende punktnummer, hvis det er muligt. Flydende punktnumre kan angives på en af de måder, der accepteres af en ANSI-kompatibel C-compiler (bortset fra atf, F, l, ogL suffikser vil ikke være tilladt i de fleste installationer). For eksempel er alle følgende gyldige flydepunktstal: 2.1, 3., 6e4, 7.91e + 16. Hvis ingen numerisk fortolkning er mulig, bliver en operand efterladt som en streng (og kun et begrænset antal operatører kan anvendes på det).
Operands kan specificeres på en af følgende måder:
1
Som en numerisk værdi, enten heltal eller flydende punkt.
2
Som en Tcl-variabel, ved hjælp af standard$ notation. Variabelens værdi vil blive brugt som operand.
3
Som en streng indesluttet i dobbelt citater. Ekspressionsparseren udfører backslash-, variabel- og kommandosubstitutioner på informationerne mellem citaterne og bruger den resulterende værdi som operand
4
Som en streng indesluttet i håndtag. Tegnene mellem den åbne bøjle og matchende lukkebøjle vil blive anvendt som operand uden substitutioner.
5
Som en Tcl-kommando indeholdt i parentes. Kommandoen vil blive udført, og dens resultat vil blive brugt som operand.
6
Som en matematisk funktion, hvis argumenter har nogen af de ovennævnte former for operander, såsomsin ($ x). Se nedenfor for en liste over definerede funktioner.
Hvor substitutioner forekommer ovenfor (fx inden citerede strenge), udføres de af ekspressionens instruktioner. Imidlertid kan et yderligere lag af substitution allerede være blevet udført af kommandoparseren før ekspressionsprocessoren blev kaldt. Som diskuteret nedenfor er det normalt bedst at vedhæfte udtryk i seler for at forhindre kommandoparseren i at udføre substitutioner på indholdet.
For nogle eksempler på simple udtryk, antag variablen-en har værdien 3 og variablenbhar værdien 6. Derefter vil kommandoen på venstre side af hver af linjerne nedenfor producere værdien på højre side af linjen:
expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * længde "6 2" 8 expr {{ord et} <"ord $ a"} 0
Operatører
De gyldige operatører er anført nedenfor, grupperet i faldende rækkefølge af forrang:
- + ~ !
Unary minus, unary plus, bit-wise IKKE, logisk IKKE. Ingen af disse operander kan anvendes på strengoperander og bitvis. IKKE må kun anvendes til heltal.
* / %
Multiplicere, opdele, resten. Ingen af disse operander kan anvendes til strengoperander, og resten kan kun anvendes på heltal. Resten vil altid have samme tegn som divisoren og en absolut værdi mindre end divisoren.
+ -
Tilføj og subtrahere. Gyldig for alle numeriske operander.
<< >>
Venstre og højre skift. Gælder kun for heltalsoperationer. Et højre skifte fortager altid tegnbiten.
< > <= >=
Boolean mindre, større, mindre end eller lige, og større end eller lige. Hver operatør producerer 1, hvis betingelsen er sand, 0 ellers. Disse operatører kan anvendes på strenge såvel som numeriske operander, i hvilket tilfælde streng sammenligning anvendes.
== !=
Boolean lige og ikke lige. Hver operatør producerer et nul / et resultat. Gælder for alle operand typer.
&
Bit-wise AND. Gælder kun for heltalsoperationer.
^
Bitvis eksklusiv OR. Gælder kun for heltalsoperationer.
|
Bitvis OR. Gælder kun for heltalsoperationer.
&&
Logisk AND. Producerer et 1 resultat, hvis begge operander er ikke-nul, 0 ellers. Gælder kun for booleanske og numeriske (heltal eller flydende punkt) operander.
||
Logisk ELLER. Producerer et 0 resultat, hvis begge operander er nul, 1 ellers. Gælder kun for booleanske og numeriske (heltal eller flydende punkt) operander.
x ? y : z
If-then-else, som i C. Hvis x vurderes til ikke-nul, så er resultatet værdien af y . Ellers er resultatet værdien af z . Det x operand skal have en numerisk værdi.
Se C manualen for flere detaljer om resultaterne produceret af hver operatør. Alle de binære operatørgrupper vender mod højre inden for samme prioritetsniveau. For eksempel kommandoen
expr 4 * 2 <7
returnerer 0.
Det&&, ||, og?: operatørerne har `` doven evaluering '', ligesom i C, hvilket betyder, at operander ikke vurderes, hvis de ikke er nødvendige for at bestemme udfaldet. For eksempel i kommandoen
expr {$ v? a: b}
kun en afen ellerB vil faktisk blive vurderet, afhængigt af værdien af$ v. Bemærk dog, at dette kun er sandt, hvis hele udtrykket er lukket i bøjler; Ellers vil Tcl-parseren evaluere begge deleen ogB før påberåbning afexpr kommando.
Math funktioner
Tcl understøtter følgende matematiske funktioner i udtryk:
abs coshlogsqrt acos dobbeltlog10srand som i exppowtan solbrændt etagerandtanh ATAN2 FMODrund ceil hypotsynd cos intsinh
abs ( arg )
Returnerer den absolutte værdi af arg . arg kan være enten heltal eller flydende punkt, og resultatet returneres i samme form.
cos ( arg )
Returnerer bue cosinus af arg , i området 0, pi radianer. arg bør ligge i området -1,1.
som i( arg )
Returnerer bue sinus af arg , i intervallet -pi / 2, pi / 2 radianer. arg bør ligge i området -1,1.
solbrændt( arg )
Returnerer bue tangenten af arg , i intervallet -pi / 2, pi / 2 radianer.
ARCTAN2 ( x, y )
Returnerer bue tangenten af y / x , i rækken -pi, pi radianer. x og y kan ikke begge være 0.
ceil ( arg )
Returnerer den mindste heltalsværdi ikke mindre end arg .
cos ( arg )
Returnerer cosinus af arg , målt i radianer.
cosh ( arg )
Returnerer den hyperbolske cosinus af arg . Hvis resultatet ville medføre overløb, returneres en fejl.
dobbelt( arg )
Hvis arg er en flydende værdi, returnerer arg , konverterer ellers arg at flyde og returnerer den konverterede værdi.
exp ( arg )
Returnerer eksponenten af arg , defineret som e ** arg . Hvis resultatet ville medføre overløb, returneres en fejl.
etage( arg )
Returnerer den største integrale værdi ikke større end arg .
FMOD ( x, y )
Returnerer flydende punktrester af divisionen af x ved y . Hvis y er 0, returneres en fejl.
hypot ( x, y )
Beregner længden af hypotenus af en retvinklet trekant ( x * x + y * y ).
int ( arg )
Hvis arg er et helt tal, returnerer arg , konverterer ellers arg til heltal ved trunkning og returnerer den konverterede værdi.
log ( arg )
Returnerer den naturlige logaritme af arg . arg skal være en positiv værdi.
log10 ( arg )
Returnerer basen 10 logaritmen til arg . arg skal være en positiv værdi.
pow ( x, y )
Beregner værdien af x rejst til magten y . Hvis x er negativ, y skal være et helt tal værdi.
rand ()
Returnerer et flytpunktspunkt fra nul til lige mindre end en eller i matematiske termer, området 0,1. Frøet kommer fra maskinens indvendige ur eller kan indstilles manuelt med srand-funktionen.
rund( arg )
Hvis arg er et helt tal, returnerer arg , konverterer ellers arg til heltal ved afrunding og returnerer den konverterede værdi.
synd( arg )
Returnerer sinus af arg , målt i radianer.
sinh ( arg )
Returnerer den hyperbolske sinus af arg . Hvis resultatet ville medføre overløb, returneres en fejl.
sqrt ( arg )
Returnerer kvadratroden af arg . arg skal være ikke-negativ.
srand ( arg )
Det arg , som skal være et helt tal, bruges til at nulstille frøet til tilfældig talgeneratoren. Returnerer det første tilfældige tal fra det pågældende frø. Hver tolk har sit eget frø.
tan ( arg )
Returnerer tangenten til arg , målt i radianer.
tanh ( arg )
Returnerer den hyperbolske tangent af arg .
Ud over disse foruddefinerede funktioner kan applikationer definere yderligere funktioner ved hjælp afTcl_CreateMathFunc().
Typer, Overflow og Precision
Alle interne beregninger, der involverer heltal, udføres med C-typen lang , og alle interne beregninger, der involverer flydende punkt, udføres med C-typen dobbelt . Når du konverterer en streng til flydende punkt, registreres eksponentoverløb og resulterer i en Tcl-fejl. For konvertering til heltal fra streng afhænger detektering af overløb af adfærd af nogle rutiner i det lokale C-bibliotek, så det skal betragtes som upåliteligt. Under alle omstændigheder er heltalsoverløb og understrøm generelt ikke pålideligt pålidelige for mellemresultater. Flydende punktoverløb og understrøm er detekteret i den grad, der understøttes af hardwaren, hvilket generelt er temmelig pålideligt.
Konvertering mellem interne repræsentationer for heltal, floating-point og string operands udføres automatisk efter behov. Til aritmetiske beregninger anvendes heltal, indtil der er indført noget flydende punktnummer, hvorefter flydende punkt anvendes. For eksempel,
expr 5/4
returnerer 1, mens
expr 5 / 4.0 expr 5 / (strenglængde "abcd" + 0,0)
begge returnerer 1,25. Flydende punktværdier returneres altid med et ``.'' eller ene så de ikke vil se ud som heltal værdier. For eksempel,
expr 20.0 / 5.0
vender tilbage4.0, ikke4.
String Operations
Strengværdier kan anvendes som operand for sammenligningsoperatørerne, selv om ekspressionsevaluatoren forsøger at foretage sammenligninger som heltal eller flydende punkt, når det kan. Hvis en af operanderne for en sammenligning er en streng, og den anden har en numerisk værdi, konverteres den numeriske operand tilbage til en streng ved hjælp af C sprintf format specifier% d for heltal og% g for flydende punktværdier. For eksempel kommandoerne
expr {"0x03"> "2"} expr {"0y" <"0x12"}
begge retur 1. Den første sammenligning sker ved hjælp af heltal sammenligning, og den anden er færdig med brug af streng sammenligning efter den anden operand konverteres til strengen18. På grund af Tcls tendens til at behandle værdier som tal, når det er muligt, er det generelt ikke en god idé at bruge operatører som==når du virkelig ønsker streng sammenligning og operandernes værdier kan være vilkårlig; Det er bedre i disse tilfælde at brugesnor kommando i stedet.
Overvejelser om præstationer
Indsæt udtryk i bøjler for den bedste hastighed og de mindste krav til opbevaring. Dette gør det muligt for Tcl bytecode compiler at generere den bedste kode.
Som nævnt ovenfor erstattes udtryk to gange: en gang ved Tcl-parseren og en gang ved expr kommando. For eksempel kommandoerne
sæt en 3 sæt b {$ a + 2} expr $ b * 4
returnere 11, ikke et multipel af 4. Dette skyldes, at Tcl-parseren først erstatter$ a + 2 for variablenb, så denexpr kommandoen vil evaluere udtrykket$ a + 2 * 4.
De fleste udtryk kræver ikke en anden runde af substitutioner. Enten er de lukket i seler eller, hvis ikke, giver deres variable og kommandosubstitutioner tal eller strings, som ikke selv kræver udskiftninger. Men fordi nogle få unbraced udtryk har brug for to runder af substitutioner, skal bytecode compiler udstyre yderligere instruktioner til at håndtere denne situation. Den dyreste kode er påkrævet for unbraced udtryk, der indeholder kommandosubstitutioner. Disse udtryk skal implementeres ved at generere ny kode hver gang udtrykket udføres.
nøgleord
aritmetisk, boolsk, sammenligne, udtryk, uklar sammenligning
Vigtig: Brug mand kommando ( % mand ) for at se, hvordan en kommando bruges på din computer.