Naam
expr - Evalueer een uitdrukking
Korte inhoud
expr arg ? arg arg … ?
Voegt arg 's (scheidingsruimten ertussen toevoegen), evalueert het resultaat als een Tcl-uitdrukking en retourneert de waarde. De operators die in Tcl-expressies zijn toegestaan, zijn een subset van de operators die zijn toegestaan in C-expressies en ze hebben dezelfde betekenis en prioriteit als de overeenkomstige C-operators. Uitdrukkingen leveren bijna altijd numerieke resultaten op (waarden voor geheel getal of drijvende komma). Bijvoorbeeld de uitdrukking
expr 8.2 + 6
evalueert tot 14.2. Tcl-expressies verschillen van C-expressies in de manier waarop operanden worden opgegeven. Tcl-expressies ondersteunen ook niet-numerieke operanden en stringvergelijkingen.
operanden
Een Tcl-expressie bestaat uit een combinatie van operanden, operatoren en haakjes. Er kan witte ruimte worden gebruikt tussen de operanden en operatoren en haakjes; het wordt genegeerd door de instructies van de uitdrukking. Waar mogelijk worden operanden geïnterpreteerd als integerwaarden. Geheel getalwaarden kunnen worden opgegeven in decimaal (het normale geval), in octaal (als het eerste teken van de operand is0), of in hexadecimaal (als de eerste twee tekens van de operand zijn0x). Als een operand niet een van de hierboven vermelde integer-indelingen heeft, wordt deze behandeld als een drijvende kommagetal als dat mogelijk is. Drijvende-kommagetallen kunnen worden opgegeven op een van de manieren die worden geaccepteerd door een ANSI-compatibele C-compiler (behalve dat def, F, l, enL achtervoegsels zijn in de meeste installaties niet toegestaan). Alle volgende zijn bijvoorbeeld geldige drijvende-kommagetallen: 2.1, 3., 6e4, 7.91e + 16. Als er geen numerieke interpretatie mogelijk is, wordt een operand als een tekenreeks achtergelaten (en kan slechts een beperkte set operatoren worden toegepast).
Operanden kunnen op een van de volgende manieren worden gespecificeerd:
1
Als een numerieke waarde, geheel getal of drijvende komma.
2
Als een Tcl-variabele, met behulp van standaard$ notatie. De waarde van de variabele wordt gebruikt als de operand.
3
Als een string ingesloten in dubbele aanhalingstekens. De expressie-parser voert backslash, variabele en opdrachtsubstituties uit op de informatie tussen de aanhalingstekens en gebruikt de resulterende waarde als de operand
4
Als een string tussen accolades. De tekens tussen de open accolade en de overeenkomende nauwe accolade worden gebruikt als de operand zonder substituties.
5
Als een Tcl-opdracht tussen haakjes. De opdracht wordt uitgevoerd en het resultaat ervan wordt gebruikt als de operand.
6
Als een wiskundige functie waarvan de argumenten een van de bovenstaande vormen hebben voor operanden, zoalssin ($ x). Zie hieronder voor een lijst met gedefinieerde functies.
Waar substituties hierboven voorkomen (bijvoorbeeld binnen geciteerde reeksen), worden ze uitgevoerd door de instructies van de uitdrukking. Er kan echter al een extra substitutielaag zijn uitgevoerd door de opdrachtparser voordat de expressieprocessor werd aangeroepen. Zoals hieronder wordt besproken, is het meestal het beste om uitdrukkingen in accolades in te sluiten om te voorkomen dat de opdrachtparser substituties op de inhoud uitvoert.
Voor sommige voorbeelden van eenvoudige uitdrukkingen, stel dat de variabeleeen heeft de waarde 3 en de variabelebheeft de waarde 6. Dan zal de opdracht aan de linkerkant van elk van de onderstaande regels de waarde aan de rechterkant van de regel produceren:
expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * llength "6 2" 8 expr {{word one} <"word $ a"} 0
operators
De geldige operatoren staan hieronder vermeld, gegroepeerd in afnemende volgorde van prioriteit:
- + ~ !
Unary minus, unary plus, bit-wise NOT, logical NOT. Geen van deze operands mag worden toegepast op string-operanden en bit-wise NOT mag alleen worden toegepast op gehele getallen.
* / %
Vermenigvuldigen, delen, resteren. Geen van deze operanden mag worden toegepast op string-operanden en de rest kan alleen op gehele getallen worden toegepast. De rest heeft altijd hetzelfde teken als de deler en een absolute waarde kleiner dan de deler.
+ -
Toevoegen en aftrekken. Geldig voor alle numerieke operanden.
<< >>
Links en rechts shift. Alleen geldig voor gehele operanden. Een rechtsverschuiving propageert altijd het tekenbit.
< > <= >=
Booleaans kleiner, groter, kleiner dan of gelijk aan, en groter dan of gelijk aan. Elke operator produceert 1 als de voorwaarde waar is, 0 anders. Deze operators kunnen zowel op strings als op numerieke operanden worden toegepast, in welk geval stringvergelijking wordt gebruikt.
== !=
Boolean gelijk en niet gelijk. Elke operator produceert een nul / één resultaat. Geldig voor alle operandtypen.
&
Bitgewijs EN. Alleen geldig voor gehele operanden.
^
Bit-wijs exclusief OF. Alleen geldig voor gehele operanden.
|
Bit-wijs OF. Alleen geldig voor gehele operanden.
&&
Logisch EN. Produceert een 1 resultaat als beide operanden niet nul zijn, 0 anders. Alleen geldig voor booleaanse en numerieke operatoren (gehele getallen of drijvende komma).
||
Logische OR. Produceert een 0-resultaat als beide operanden nul zijn, anders 1. Alleen geldig voor booleaanse en numerieke operatoren (gehele getallen of drijvende komma).
X ? Y : z
Als-dan-anders, zoals in C. Als X evalueert naar niet-nul, dan is het resultaat de waarde van Y . Anders is het resultaat de waarde van z . De X operand moet een numerieke waarde hebben.
Zie de C-handleiding voor meer informatie over de resultaten van elke operator. Alle binaire operatoren groeperen van links naar rechts binnen hetzelfde prioriteitsniveau. Bijvoorbeeld het commando
expr 4 * 2 <7
geeft 0 terug.
De&&, ||, en?: operators hebben `` luie evaluatie '', net als in C, wat betekent dat operanden niet worden geëvalueerd als ze niet nodig zijn om de uitkomst te bepalen. Bijvoorbeeld in de opdracht
expr {$ v? a: b
slechts een vaneen ofB wordt daadwerkelijk geëvalueerd, afhankelijk van de waarde van$ v. Merk echter op dat dit alleen waar is als de volledige uitdrukking tussen haakjes staat; anders zal de Tcl-parser beide evaluereneen enB voordat u deexpr commando.
Wiskundige functies
Tcl ondersteunt de volgende wiskundige functies in uitdrukkingen:
buikspieren gummistoklogboeksqrt acos dubbelelog10srand als in exppowbruinen een kleurtje verdiepingrandtanh atan2 FMODronde ceil de stzonde cos intsinh
buikspieren( arg )
Retourneert de absolute waarde van arg . Arg kan een geheel getal of een drijvend punt zijn en het resultaat wordt in dezelfde vorm geretourneerd.
acos ( arg )
Retourneert de boogcosinus van arg , in het bereik van 0, pi radialen. Arg moet in het bereik -1,1 liggen.
als in( arg )
Retourneert de boog sinus van arg , in het bereik -pi / 2, pi / 2 radialen. Arg moet in het bereik -1,1 liggen.
een kleurtje( arg )
Retourneert de arc tangens van arg , in het bereik -pi / 2, pi / 2 radialen.
atan2 ( x, y )
Retourneert de arc tangens van Y / X , in de reeks -pi, pi radialen. X en Y kan niet allebei 0 zijn.
ceil ( arg )
Retourneert de kleinste gehele waarde van niet minder dan arg .
cos ( arg )
Retourneert de cosinus van arg , gemeten in radialen.
cosh ( arg )
Retourneert de cosinus hyperbolicus van arg . Als het resultaat een overloop zou veroorzaken, wordt een fout geretourneerd.
dubbele( arg )
Als arg is een zwevende waarde, retourneert arg , anders converteert arg naar zwevend en retourneert de geconverteerde waarde.
exp ( arg )
Retourneert de exponentiële waarde van arg , gedefinieerd als e ** arg . Als het resultaat een overloop zou veroorzaken, wordt een fout geretourneerd.
verdieping( arg )
Retourneert de grootste integraalwaarde die niet groter is dan arg .
FMOD ( x, y )
Retourneert de drijvende-komma-rest van de verdeling van X door Y . Als Y is 0, er wordt een fout geretourneerd.
de st ( x, y )
Berekent de lengte van de hypotenusa van een rechthoekige driehoek ( X * X + Y * Y ).
int ( arg )
Als arg is een geheel getal, retouren arg , anders converteert arg tot geheel getal door truncatie en retourneert de geconverteerde waarde.
inloggen ( arg )
Retourneert de natuurlijke logaritme van arg . Arg moet een positieve waarde zijn.
log10 ( arg )
Retourneert de logaritme van basis 10 van arg . Arg moet een positieve waarde zijn.
pow ( x, y )
Berekent de waarde van X verhoogd tot de macht Y . Als X is negatief, Y moet een geheel getal zijn.
rand()
Retourneert een drijvend kommagetal van nul tot net minder dan één of, in wiskundige termen, het bereik 0,1). Het zaadje komt van de interne klok van de machine of kan handmatig worden ingesteld met de srand-functie.
ronde( arg )
Als arg is een geheel getal, retouren arg , anders converteert arg tot geheel getal door afronding en retourneert de geconverteerde waarde.
zonde( arg )
Retourneert de sinus van arg , gemeten in radialen.
sinh ( arg )
Retourneert de hyperbolische sinus van arg . Als het resultaat een overloop zou veroorzaken, wordt een fout geretourneerd.
sqrt ( arg )
Retourneert de vierkantswortel van arg . Arg moet niet-negatief zijn.
srand ( arg )
De arg , wat een geheel getal moet zijn, wordt gebruikt om het zaad voor de willekeurige nummergenerator te resetten. Retourneert het eerste willekeurige getal uit dat zaad. Elke tolk heeft zijn eigen zaad.
bruinen( arg )
Retourneert de tangens van arg , gemeten in radialen.
tanh ( arg )
Retourneert de tangens hyperbolicus van arg .
Naast deze vooraf gedefinieerde functies, kunnen applicaties extra functies definiëren met behulp vanTcl_CreateMathFunc().
Typen, overloop en precisie
Alle interne berekeningen met gehele getallen worden gedaan met het C-type lang , en alle interne berekeningen met floating-point worden gedaan met het C-type dubbele . Bij het converteren van een string naar floating-point, wordt exponentoverloop gedetecteerd en resulteert in een Tcl-fout. Voor conversie naar integer van tekenreeks hangt de detectie van overloop af van het gedrag van sommige routines in de lokale C-bibliotheek, dus het moet als onbetrouwbaar worden beschouwd. In elk geval worden integeroverloop en onderstroom in het algemeen niet betrouwbaar gedetecteerd voor tussenresultaten. Floating-point overflow en underflow worden gedetecteerd in de mate die wordt ondersteund door de hardware, die over het algemeen redelijk betrouwbaar is.
Conversie tussen interne representaties voor integer, floating-point en string-operanden gebeurt automatisch als dat nodig is. Voor rekenkundige berekeningen worden gehele getallen gebruikt totdat een drijvend kommagetal is ingevoerd, waarna drijvende komma wordt gebruikt. Bijvoorbeeld,
Uitdr 5/4
geeft 1 terug, terwijl
expr 5 / 4.0 expr 5 / (string length "abcd" + 0,0)
beide keren 1,25 terug. Drijvende-kommawaarden worden altijd geretourneerd met een ``.'' of eene zodat ze niet op gehele waarden lijken. Bijvoorbeeld,
expr 20.0 / 5.0
komt terug4.0, niet4.
Stringbewerkingen
Stringwaarden kunnen worden gebruikt als operanden van de vergelijkingsoperators, hoewel de expressie-evaluator vergelijkingen probeert te doen als geheel getal of drijvende komma wanneer dit kan. Als een van de operanden van een vergelijking een tekenreeks is en de andere een numerieke waarde heeft, wordt de numerieke operand terug geconverteerd naar een tekenreeks met behulp van de C sprintf formaat specificatie% d voor gehele getallen en% g voor drijvende-kommawaarden. Bijvoorbeeld de opdrachten
expr {"0x03"> "2"} expr {"0y" <"0x12"}
beide keren terug 1. De eerste vergelijking wordt gedaan met behulp van gehele getallenvergelijking en de tweede wordt gedaan met behulp van stringvergelijking nadat de tweede operand is geconverteerd naar de tekenreeks18. Vanwege de neiging van Tcl om waar mogelijk getallen als getallen te behandelen, is het over het algemeen geen goed idee om operatoren te gebruiken==wanneer je echt een vergelijking van strings wilt en de waarden van de operanden willekeurig kunnen zijn; het is in deze gevallen beter om dedraad commando in plaats daarvan.
Overwegingen bij de uitvoering
Sluit uitdrukkingen tussen accolades in voor de beste snelheid en de kleinste opslagvereisten. Hierdoor kan de Tcl bytecode-compiler de beste code genereren.
Zoals hierboven vermeld, worden uitdrukkingen twee keer gesubstitueerd: één keer door de Tcl-parser en één keer door de expr commando. Bijvoorbeeld de opdrachten
zet een 3 stel b {$ a + 2} in expr $ b * 4
return 11, geen veelvoud van 4. Dit komt omdat de Tcl-parser als eerste zal substitueren$ a + 2 voor de variabeleb, dan deexpr commando zal de uitdrukking evalueren$ a + 2 * 4.
De meeste uitdrukkingen vereisen geen tweede ronde van substituties. Of ze zijn ingesloten tussen accolades of, zo niet, hun variabele en opdrachtsubstituties leveren getallen of strings op die zelf geen substituties vereisen. Omdat een aantal unbraced expressies twee ronden van substituties nodig hebben, moet de bytecode-compiler aanvullende instructies geven om deze situatie aan te pakken. De duurste code is vereist voor unbraced expressies die opdrachtsubstituties bevatten. Deze uitdrukkingen moeten worden geïmplementeerd door elke keer dat de expressie wordt uitgevoerd nieuwe code te genereren.
trefwoorden
rekenkundig, booleaans, vergelijken, expressie, fuzzyvergelijking
Belangrijk: Gebruik de man commando ( % man ) om te zien hoe een opdracht wordt gebruikt op uw specifieke computer.




