namn
expr - Utvärdera ett uttryck
Synopsis
expr arg ? arg arg … ?
Sammanfogar arg s (adderar separatorutrymmen mellan dem), utvärderar resultatet som ett Tcl-uttryck och returnerar värdet. De operatörer som är tillåtna i Tcl-uttryck är en delmängd av operatörerna tillåtna i C-uttryck, och de har samma betydelse och företräde som motsvarande C-operatörer. Uttryck ger nästan alltid numeriska resultat (heltal eller flytande värden). Till exempel uttrycket
expr 8.2 + 6
utvärderar till 14,2. Tcl uttryck skiljer sig från C uttryck i det sätt som operandor anges. Tcl-uttryck stöder också icke-numeriska operander och strängsammanställningar.
Operander
Ett Tcl-uttryck består av en kombination av operander, operatörer och parenteser. Vitt utrymme kan användas mellan operanderna och operatörerna och parenteserna. det ignoreras av uttryckets instruktioner. Om möjligt tolkar operanderna som heltal. Heltalsvärden kan anges i decimal (det normala fallet), i oktal (om operandens första tecken är0) eller i hexadecimal (om de två första tecknen i operand är0x). Om en operand inte har ett av de heltalformat som ges ovan, behandlas det som ett flytande punktnummer om det är möjligt. Flyttpunkter kan anges på något av de sätt som accepteras av en ANSI-kompatibel C-kompilator (förutom attf, F, l, ochL suffixer är inte tillåtna i de flesta installationer). Till exempel är alla följande giltiga flytande punkter: 2.1, 3., 6e4, 7.91e + 16. Om ingen numerisk tolkning är möjlig, lämnas en operand som en sträng (och endast en begränsad uppsättning operatörer kan appliceras på den).
Operander kan specificeras på något av följande sätt:
1
Som ett numeriskt värde, antingen heltal eller flytande punkt.
2
Som en Tcl-variabel, använder du standard$ notation. Variabelns värde kommer att användas som operand.
3
Som en sträng som bifogas dubbla citat. Expressionsparsern kommer att utföra backslash-, variabel- och kommandosubstitutioner på informationen mellan citat och använda det resulterande värdet som operand
4
Som en sträng som är innesluten i axlarna. Karaktärerna mellan den öppna hållaren och matchande nära hållaren kommer att användas som operand utan några substitutioner.
5
Som ett Tcl-kommando i parentes. Kommandot kommer att utföras och dess resultat kommer att användas som operand.
6
Som en matematisk funktion vars argument har någon av ovanstående former för operander, såsomsin ($ x). Se nedan för en lista med definierade funktioner.
När substitutioner uppträder ovan (t ex inom citerade strängar) utförs de genom uttrycks instruktioner. Emellertid kan ett ytterligare lager av substitution redan ha utförts av kommandoparseren innan expressionsprocessorn kallades. Såsom diskuteras nedan är det vanligtvis bäst att bifoga uttryck i hakparentes för att förhindra att kommandoparseren utför substitutioner på innehållet.
För några exempel på enkla uttryck, anta variabelnen har värdet 3 och variabelnbhar värdet 6. Då kommer kommandot på vänster sida av var och en av raderna nedan att producera värdet på höger sida av raden:
expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * length "6 2" 8 expr {{ord ett} <"ord $ a"} 0
operatörer
De giltiga operatörerna listas nedan, grupperade i minskande prioriteringsordning:
- + ~ !
Unary minus, unary plus, bit-wise INTE, logiskt INTE. Ingen av dessa operander kan appliceras på strängoperander och bitvis INTE får endast tillämpas på heltal.
* / %
Multiplicera, dela, återstående. Ingen av dessa operander kan appliceras på strängoperander, och återstoden får endast tillämpas på heltal. Resten kommer alltid att ha samma tecken som divisorn och ett absolut värde mindre än divisorn.
+ -
Lägg till och subtrahera. Giltig för alla numeriska operander.
<< >>
Vänster och höger skift. Gäller endast för heltal. Ett rätt skift sprider alltid teckenbiten.
< > <= >=
Boolean mindre, större, mindre än eller lika, och större än eller lika. Varje operatör producerar 1 om villkoret är sant, 0 annars. Dessa operatörer kan tillämpas på strängar såväl som numeriska operander, i vilket fall sträng jämförelse används.
== !=
Boolean lika och inte lika. Varje operatör ger ett noll / ett resultat. Giltig för alla operandtyper.
&
Bitvis och AND. Gäller endast för heltal.
^
Bitvis exklusiv ELLER. Gäller endast för heltal.
|
Bitvis OR. Gäller endast för heltal.
&&
Logisk OCH. Ger ett 1 resultat om båda operanderna är icke-noll, 0 annars. Gäller endast för booleska och numeriska (heltal eller flytande punkt) operander.
||
Logisk OR. Ger ett 0 resultat om båda operanderna är noll, 1 annars. Gäller endast för booleska och numeriska (heltal eller flytande punkt) operander.
x ? y : z
Om-då-annars, som i C. Om x utvärderas till icke-noll, då är resultatet värdet av y . I annat fall är resultatet värdet av z . De x operand måste ha ett numeriskt värde.
Se C-manualen för mer information om resultaten från varje operatör. Alla binär operatörsgrupp vänster-till-höger inom samma prioritetsnivå. Till exempel kommandot
expr 4 * 2 <7
returnerar 0.
De&&, ||, och?: operatörerna har "lat utvärdering", precis som i C, vilket innebär att operander inte utvärderas om de inte behövs för att bestämma resultatet. Till exempel i kommandot
expr {$ v? a: b}
bara en aven ellerB kommer faktiskt att utvärderas, beroende på värdet av$ v. Observera dock att detta endast är sant om hela uttrycket är inneslutet i axlarna; annars kommer Tcl-parsern att utvärdera bådaen ochB innan man åberoparexpr kommando.
Matematiska funktioner
Tcl stöder följande matematiska funktioner i uttryck:
magmuskler coshloggasqrt Acos dubbellog10srand som i exppowsolbränna en bränna golvrandtanh atan2 FMODrunda FÖRSE MED INNERTAK hypotsynd cos intsinh
magmuskler( arg )
Returnerar absolutvärdet av arg . Arg kan vara heltal eller flytpunkt, och resultatet returneras i samma form.
Acos ( arg )
Returnerar bågens cosinus av arg i intervallet 0, pi radianer. Arg bör ligga i intervallet -1,1.
som i( arg )
Returnerar bågens sinus av arg , i intervallet -pi / 2, pi / 2 radianer. Arg bör ligga i intervallet -1,1.
en bränna( arg )
Returnerar bågens tangent arg , i intervallet -pi / 2, pi / 2 radianer.
atan2 ( x, y )
Returnerar bågens tangent y / x , i intervallet -pi, pi radianer. x och y kan inte båda vara 0.
ceil ( arg )
Returnerar det minsta heltalsvärdet inte mindre än arg .
cos ( arg )
Returnerar cosinus av arg , mätt i radianer.
cosh ( arg )
Returnerar den hyperboliska cosinusen av arg . Om resultatet skulle orsaka överflöde, returneras ett fel.
dubbel( arg )
Om arg är ett flytande värde, returnerar arg , omvandlar annars arg att flyta och returnerar det konverterade värdet.
exp ( arg )
Returnerar exponentiellet av arg , definierad som e ** arg . Om resultatet skulle orsaka överflöde, returneras ett fel.
golv( arg )
Returnerar det största integrerade värdet inte större än arg .
FMOD ( x, y )
Returnerar den flytande punkten återstoden av divisionen av x av y . Om y är 0, ett fel returneras.
hypot ( x, y )
Beräknar längden på hypotenusen av en rät vinklad triangel ( x * x + y * y ).
int ( arg )
Om arg är ett heltal värde, returnerar arg , omvandlar annars arg till heltal genom trunkning och returnerar det konverterade värdet.
logga( arg )
Returnerar den naturliga logaritmen till arg . Arg måste vara ett positivt värde.
log10 ( arg )
Returnerar bas 10 logaritmen av arg . Arg måste vara ett positivt värde.
pow ( x, y )
Beräknar värdet av x höjde sig till makten y . Om x är negativ, y måste vara ett heltal värde.
rand()
Returnerar ett flytpunktsnummer från noll till bara mindre än en eller, i matematiska termer, intervallet 0,1. Fröet kommer från maskinens interna klocka eller kan ställas in manuellt med srand-funktionen.
runda( arg )
Om arg är ett heltal värde, returnerar arg , omvandlar annars arg till heltal genom avrundning och returnerar det konverterade värdet.
synd( arg )
Returnerar sinus av arg , mätt i radianer.
sinh ( arg )
Returnerar hyperbolic sinus av arg . Om resultatet skulle orsaka överflöde, returneras ett fel.
sqrt ( arg )
Returnerar kvadratroten av arg . Arg måste vara icke-negativ.
srand ( arg )
De arg , som måste vara ett heltal, används för att återställa utsädet för slumptalsgeneratorn. Returnerar det första slumptalet från det fröet. Varje tolk har sitt eget frö.
solbränna( arg )
Returnerar tangenten till arg , mätt i radianer.
tanh ( arg )
Returnerar den hyperboliska tangenten av arg .
Utöver dessa fördefinierade funktioner kan applikationer definiera ytterligare funktioner medTcl_CreateMathFunc().
Typer, Överflöde och Precision
Alla interna beräkningar som innefattar heltal görs med C-typen lång , och alla interna beräkningar med flytande punkt görs med C-typen dubbel . Vid omvandling av en sträng till flytpunkten detekteras exponentflödet och resulterar i ett Tcl-fel. För omvandling till heltal från sträng beror detektering av överflöd på uppförandet av vissa rutiner i det lokala C-biblioteket, så det bör betraktas som opålitligt. I vilket fall detekteras inte heltalsflödet och underflödet på ett tillförlitligt sätt för mellanliggande resultat. Flytande punktöverflöde och underflöde detekteras i den grad som maskinvaran stöder, vilket i allmänhet är ganska tillförlitlig.
Konvertering mellan interna representationer för heltal, flytande punkt och strängoperander görs automatiskt efter behov. För aritmetiska beräkningar används heltal tills några flytande punktnummer införs, varefter flytpunkt används. Till exempel,
expr 5/4
returnerar 1, medan
expr 5 / 4.0 expr 5 / (stränglängd "abcd" + 0,0)
båda returnerar 1,25. Flyttpunkterna returneras alltid med en ``.'' eller ene så att de inte kommer att se ut som heltal värden. Till exempel,
expr 20,0 / 5,0
avkastning4.0, inte4.
Strängoperationer
Strängvärden kan användas som operander i jämförelseoperatörerna, även om uttrycksevaluatorn försöker göra jämförelser som heltal eller flytpunkt när det kan. Om en av operandena för en jämförelse är en sträng och den andra har ett numeriskt värde, konverteras den numeriska operand tillbaka till en sträng med hjälp av C sprintf format specifier% d för heltal och% g för flytande punktvärden. Till exempel kommandon
expr {"0x03"> "2"} expr {"0y" <"0x12"}
båda retur 1. Den första jämförelsen görs med hjälp av heltal jämförelse och den andra görs med hjälp av sträng jämförelse efter det att den andra operanden konverterats till strängen18. På grund av Tcls tendens att behandla värden som nummer när det är möjligt är det inte i allmänhet en bra idé att använda operatörer som==när du verkligen vill sträng jämförelse och operandans värden kan vara godtyckliga; Det är bättre att i dessa fall användasträng kommandot istället.
Prestanda överväganden
Följa uttryck i axlar för bästa hastighet och minsta lagringskrav. Detta gör det möjligt för Tcl bytecode compiler att generera den bästa koden.
Som nämnts ovan är uttryck ersatta två gånger: en gång genom Tcl-parsern och en gång vid expr kommando. Till exempel kommandon
sätt en 3 sätt b {$ a + 2} expr $ b * 4
returnera 11, inte en multipel av 4. Detta beror på att Tcl-parsern först kommer att ersätta$ a + 2 för variabelnb, sedanexpr kommandot kommer att utvärdera uttrycket$ a + 2 * 4.
De flesta uttryck kräver inte en andra omgång av substitutioner. Antingen är de inneslutna i axlar eller, om inte, deras variabla och kommandosubstitutioner ger siffror eller strängar som inte själva kräver substitutioner. Men eftersom en del unbraced uttryck behöver två substitutioner, måste bytecode compiler utfärda ytterligare instruktioner för att hantera denna situation. Den dyraste koden är nödvändig för unbraced uttryck som innehåller kommandosubstitutioner. Dessa uttryck måste implementeras genom att generera ny kod varje gång uttrycket exekveras.
Nyckelord
aritmetiska, booleska, jämföra, uttryck, fuzzy jämförelse
Viktig: Använd man kommando ( % man ) för att se hur ett kommando används på din dator.




