257 lines
19 KiB
HTML
257 lines
19 KiB
HTML
|
<HTML><HEAD>
|
|||
|
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
|
|||
|
</HEAD>
|
|||
|
<BODY>
|
|||
|
<div><H3><b>expr Commandes Internes Tcl</b></H3></div>
|
|||
|
<HR ALIGN="center">
|
|||
|
|
|||
|
<div><b>NOM</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">expr - Evalue une expression
|
|||
|
</div><br>
|
|||
|
<div><b>SYNTAXE</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;"><b>expr </b><i>arg </i>?<i>arg arg ...</i>?
|
|||
|
</div><br>
|
|||
|
<div><b>DESCRIPTION</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Concat<EFBFBD>ne <i>arg</i>'s (en y ajoutant des s<>parateurs espaces), <20>value le r<>sultat comme expression Tcl, et retourne la valeur. Les op<6F>rateurs autoris<69>s dans les expressions Tcl sont un sous ensemble des op<6F>rateurs autoris<69>s dans les expressions C, et ils ont les m<>me sens et pr<70>c<EFBFBD>dence que les op<6F>rateurs C correspondants. Les expressions donnent presque toujours des r<>sultats num<75>riques (entier ou valeurs flottantes). Par exemple, l'expression </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr 8.2 + 6</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">est <20>valu<6C>e <20> 14.2. Les expressions Tcl diff<66>rent des expressions C dans le sens ou les op<6F>randes sont sp<73>cifi<66>s. De plus, les expressions Tcl supportent les op<6F>randes non-num<75>riques et les comparaisons de cha<68>nes.
|
|||
|
</div><br>
|
|||
|
<div><b>OPERANDES</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Une expression Tcl consiste en une combinaison d'op<6F>randes, d'op<6F>rateurs, et de parenth<74>ses. L'espace peut <20>tre employ<6F> entre les op<6F>randes, op<6F>rateurs et parenth<74>ses; il est ignor<6F> par les instructions d'expression. Si possible, les op<6F>randes sont interpr<70>t<EFBFBD>s comme des valeurs enti<74>res. Les valeurs enti<74>res peuvent <20>tre sp<73>cifi<66>es en d<>cimal (le cas normal), en octal (si le premier caract<63>re de l'op<6F>rande est <b>0</b>), ou en hexad<61>cimal (si les deux premiers caract<63>res de l'op<6F>rande sont <b>0x</b>). Si un op<6F>rande n'est pas un des formats entiers donn<6E>s plus haut, alors il est trait<69> comme un nombre flottant si c'est possible. Les nombres flottants peuvent <20>tre sp<73>cifi<66>s de toutes les mani<6E>res accept<70>es par un compilateur compatible ANSI-C (except<70> que les suffixes<b> f</b>, <b>F</b>, <b>l</b>, et <b>L</b> ne seront pas autoris<69>s dans la plupart des installations). Par exemple, tous les nombres flottants suivants sont valides : 2.1, 3., 6e4, 7.91e+16. Si aucune interpr<70>tation num<75>rique n'est possible, alors un op<6F>rande est consid<69>r<EFBFBD> comme une cha<68>ne (et seulement un ensemble limit<69> d'op<6F>rateurs peut lui <20>tre appliqu<71>). </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Les op<6F>randes peuvent <20>tre sp<73>cifi<66>s d'une des fa<66>ons suivantes: </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">[1] Comme une valeur num<75>rique, soit enti<74>re soit flottante. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">[2] Comme une variable Tcl, en utilisant la notation standard <b>$</b>. La valeur de la variable sera utilis<69>e comme op<6F>rande. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">[3] Comme une cha<68>ne entour<75>e de doubles-guillemets. L'analyseur d'expression effectuera les substitution de backslash, de variable, et de commandes sur l'information entre guillemets, et utilisera la valeur r<>sultante comme op<6F>rande </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">[4] Comme une cha<68>ne entour<75>e d'accolades. Les caract<63>res entre l'accolade ouverte et l'accolade fermante correspondante seront utilis<69>s comme op<6F>rande sans aucunes substitutions. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">[5] Comme une commande Tcl entour<75>e de crochets. La commande sera ex<65>cut<75>e et son r<>sultat sera utilis<69> comme op<6F>rande. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">[6] Comme une fonction math<74>matique dont les arguments ont une des formes definies plus haut pour les op<6F>randes , tel que <b>sin($x)</b>. Voir ci-dessous pour une liste de fonctions d<>finies. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Ou les substitutions se produisent plus haut (ex. dans les cha<68>nes entre guillemets), elles sont effectu<74>es par les instructions des expressions. N<>anmoins, une couche de substitution suppl<70>mentaire peut d<>j<EFBFBD> avoir <20>t<EFBFBD> effectu<74>e par l'analyseur de commande avant que le processeur d'expression ait <20>t<EFBFBD> appel<65>. Comme expliqu<71> ci-dessous, il est pr<70>f<EFBFBD>rable d'entourer les expressions dans des accolades pour emp<6D>cher l'analyseur de commande d'effectuer des substitutions sur le contenu. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Pour quelques exemples d'expressions simples, supposez que la variable <b>a</b> a pour valeur 3 et la variable <b>b</b> a pour valeur 6. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr 3.1 + $a6.1<br>
|
|||
|
</b><b>expr 2 + "$a.$b"5.6<br>
|
|||
|
</b><b>expr 4*[llength "6 2"]8<br>
|
|||
|
</b><b>expr {{word one} < "word $a"}0</b><br>
|
|||
|
</div><br>
|
|||
|
<div><b>OPERATEURS</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Les op<6F>rateurs valides sont list<73>s ci-dessous, group<75>s en ordre de pr<70>c<EFBFBD>dence d<>croissant:
|
|||
|
<DL>
|
|||
|
<DT><b>- + ~ !</b><br></DT><DD>Moins unaire, plus unaire, NOT bit <20> bit, NOT logique. Aucun de ces op<6F>rateurs ne peut <20>tre appliqu<71> aux op<6F>randes cha<68>ne, et NOT bit <20> bit peut seulement <20>tre appliqu<71> aux entiers.
|
|||
|
</DD>
|
|||
|
<DT><b>* / %</b><br></DT><DD>Multiplication, division, modulo. Aucun de ces op<6F>randes ne peut <20>tre appliqu<71> aux op<6F>randes cha<68>ne, et modulo peut <20>tre appliqu<71> seulement aux entiers. modulo Modulo aura toujours le m<>me signe que le diviseur et une valeur absolue inf<6E>rieure au diviseur.
|
|||
|
</DD>
|
|||
|
<DT><b>+ -</b><br></DT><DD>Addition et soustraction. Valides pour tout op<6F>rande num<75>rique.
|
|||
|
</DD>
|
|||
|
<DT><b><< >></b><br></DT><DD>D<EFBFBD>calage <20> gauche et <20> droite. Valides seulement pour les op<6F>randes entiers. Un d<>calage <20> droite propage toujours le bit de signe.
|
|||
|
</DD>
|
|||
|
<DT><b>< > <= >=</b><br></DT><DD>Bool<EFBFBD>ens inf<6E>rieur <20>, sup<75>rieur <20>, inf<6E>rieur <20> ou <20>gal, et sup<75>rieur <20> ou <20>gal. Chaque op<6F>rateur donne 1 si la condition est vraie, 0 autrement. Ces op<6F>rateurs peuvent <20>tre appliqu<71>s aux cha<68>nes aussi bien qu'aux op<6F>randes num<75>riques, dans le cas des cha<68>nes, une comparaison est utilis<69>e.
|
|||
|
</DD>
|
|||
|
<DT><b>== !=</b><br></DT><DD>Bool<EFBFBD>en <20>gal et diff<66>rent. Chaque op<6F>rateur produit un z<>ro/un r<>sultat. Valides pour tout types d'op<6F>rande.
|
|||
|
</DD>
|
|||
|
<DT><b>&</b><br></DT><DD>ET Bit <20> bit. Valide pour des op<6F>randes entiers seulement.
|
|||
|
</DD>
|
|||
|
<DT><b>^</b><br></DT><DD>OU exclusif Bit <20> bit. Valide pour des op<6F>randes entiers seulement.
|
|||
|
</DD>
|
|||
|
<DT><b>|</b><br></DT><DD>OU Bit <20> bit. Valide pour des op<6F>randes entiers seulement. </DD>
|
|||
|
<DT><b>&&</b><br></DT><DD>ET logique. Donne 1 si les deux op<6F>randes sont diff<66>rent de z<>ro, 0 autrement. Valide seulement pour pour les op<6F>randes bool<6F>ens et num<75>riques (entiers ou flottants).
|
|||
|
</DD>
|
|||
|
<DT><b>||</b><br></DT><DD>OU logique. Donne 0 si les deux op<6F>randes sont z<>ro, 1 autrement. Valide seulement pour op<6F>randes bool<6F>ens et num<75>riques (entiers ou flottants).
|
|||
|
</DD>
|
|||
|
<DT><i>x</i><b>?</b><i>y</i><b>:</b><i>z</i><br></DT><DD>If-then-else, comme en C. Si <i>x</i> est <20>valu<6C> diff<66>rent de z<>ro, alors le r<>sultat est la valeur de <i>y</i>. Autrement le r<>sultat est la valeur de <i>z</i>. L'op<6F>rande <i>x</i> doit avoir une valeur num<75>rique.
|
|||
|
</DD>
|
|||
|
</DL>
|
|||
|
</div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Voir le manuel C pour plus de d<>tails sur les r<>sultats produits par chaque op<6F>rateur. Tous les op<6F>rateurs binaire sont group<75>s de gauche <20> droite <20> l'int<6E>rieur d'un m<>me niveau de pr<70>c<EFBFBD>dence. Par exemple, la commande </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr 4*2 < 7</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">retourne 0. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Les op<6F>rateurs <b>&&</b>, <b>||</b>, et <b>?:</b> ont une "<EFBFBD>valuation paresseuse", juste comme en C, ce qui signifie que ces op<6F>randes ne ont pas <20>valu<6C>s s'ils ne sont pas n<>cessaires pour d<>terminer le r<>sultat. Par exemple, dans la commande </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr {$v ? [a] : [b]}</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">seulement un des <b>[a]</b> ou <b>[b]</b> sera <20>valu<6C>, d<>pendant de la valeur de <b>$v</b>. Notez, n<>anmoins, que ceci est seulement vrai si l'expression enti<74>re est entour<75>e d'accolades; autrement l'analyseur Tcl evaluera <b>[a]</b> et <b>[b]</b> avant d'appeler la commande<b> expr</b>.
|
|||
|
</div><br>
|
|||
|
<div><b>FONCTIONS MATHEMATIQUES </b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Tcl supporte les fonctions math<74>matiques suivantes dans les expressions: <br>
|
|||
|
|
|||
|
<TABLE ALIGN="center" BORDER="0" CELLSPACING="0" CELLPADDING="0" WIDTH="80%">
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
abs
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
cosh
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
log
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
sqrt
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
acos
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
double
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
log10
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
srand
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
asin
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
exp
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
pow
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
tan
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
atan
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
floor
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
rand
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
tanh
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
atan2
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
fmod
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
round
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
<!--R5C4-->
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
ceil
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
hypot
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
sin
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
<!--R6C4-->
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
<TR ALIGN="center">
|
|||
|
<TD>
|
|||
|
cos
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
int
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
sinh</b >
|
|||
|
</TD>
|
|||
|
<TD>
|
|||
|
<!--R7C4-->
|
|||
|
</TD>
|
|||
|
</TR>
|
|||
|
</TABLE><br>
|
|||
|
<DL>
|
|||
|
<DT><b>abs(</b><i>arg</i><b>)</b></DT><DD>Renvoie la valeur absolue de <i>arg</i>. <i>Arg</i> peut <20>tre entier ou flottant, et le r<>sultat renvoy<6F> est de la m<>me forme.
|
|||
|
</DD>
|
|||
|
<DT><b>acos(</b><i>arg</i><b>)</b></DT><DD>Renvoie l'arc cosinus de <i>arg</i>, dans l'intervalle [0,pi] radians. <i>Arg</i> sera dans l'intervalle [-1,1].
|
|||
|
</DD>
|
|||
|
<DT><b>asin(</b><i>arg</i><b>)</b></DT><DD>Renvoie l'arc sinus de <i>arg</i>, dans l'intervalle [-pi/2,pi/2] radians. <i>Arg</i> sera dans l'intervalle [-1,1].
|
|||
|
</DD>
|
|||
|
<DT><b>atan(</b><i>arg</i><b>)</b></DT><DD>Renvoie l'arc tangente de <i>arg</i>, dans l'intervalle [-pi/2,pi/2] radians.
|
|||
|
</DD>
|
|||
|
<DT><b>atan2(</b><i>x, y</i><b>)</b></DT><DD>Renvoie l'arc tangente de <i>y</i>/<i>x</i>, dans l'intervalle [-pi,pi] radians. <i>x</i> et <i>y</i> ne peuvent <20>tretous les deux 0.
|
|||
|
</DD>
|
|||
|
<DT><b>ceil(</b><i>arg</i><b>)</b></DT><DD>Renvoie la plus petite valeur enti<74>re non inf<6E>rieure <20> <i>arg</i>.
|
|||
|
</DD>
|
|||
|
<DT><b>cos(</b><i>arg</i><b>)</b></DT><DD>Renvoie le cosinus de <i>arg</i>, mesur<75> en radians.
|
|||
|
</DD>
|
|||
|
<DT><b>cosh(</b><i>arg</i><b>)</b></DT><DD>Renvoie le cosinus hyperbolique de <i>arg</i>. Si le r<>sultat cause un d<>bordement, une erreur est renvoy<6F>e.
|
|||
|
</DD>
|
|||
|
<DT><b>double(</b><i>arg</i><b>)</b></DT><DD>Si <i>arg</i> est une valeur flottante , retourne <i>arg</i>, autrement convertit <i>arg</i> en flottant et retourne la valeur convertie.
|
|||
|
</DD>
|
|||
|
<DT><b>exp(</b><i>arg</i><b>)</b></DT><DD>Renvoie l'exponentiel de <i>arg</i>, d<>fini comme e**<i>arg</i>. Si le r<>sultat cause un d<>bordement, une erreur est renvoy<6F>e.
|
|||
|
</DD>
|
|||
|
<DT><b>floor(</b><i>arg</i><b>)</b></DT><DD>Renvoie la plus grande valeur enti<74>re non sup<75>rieure <20> <i>arg</i>.</DD>
|
|||
|
<DT><b>fmod(</b><i>x, y</i><b>)</b></DT><DD>Renvoie le reste flottant de la division of <i>x</i> par <i>y</i>. Si <i>y</i> est 0, une erreur est renvoy<6F>e.
|
|||
|
</DD>
|
|||
|
<DT><b>hypot(</b><i>x, y</i><b>)</b></DT><DD>Calcule la longueur de l'hypot<6F>nuse d'un triangle rectangle(<i>x</i>*<i>x</i>+<i>y</i>*<i>y</i>).
|
|||
|
</DD>
|
|||
|
<DT><b>int(</b><i>arg</i><b>)</b></DT><DD>Si <i>arg</i> est une valeur enti<74>re, retourne <i>arg</i>, autrement convertit <i>arg</i> en entier par truncature et retourne la valeur convertie.
|
|||
|
</DD>
|
|||
|
<DT><b>log(</b><i>arg</i><b>)</b></DT><DD>Renvoie le logarithme naturel de <i>arg</i>. <i>Arg</i> doit <20>tre une valeur positive.
|
|||
|
</DD>
|
|||
|
<DT><b>log10(</b><i>arg</i><b>)</b></DT><DD>Renvoie le logarithme base 10 de <i>arg</i>. <i>Arg</i> doit <20>tre une valeur positive.
|
|||
|
</DD>
|
|||
|
<DT><b>pow(</b><i>x, y</i><b>)</b></DT><DD>Calcule la valeur de <i>x</i> elev<65> <20> la puissance <i>y</i>. Si <i>x</i> est n<>gatif, <i>y</i> doit <20>tre une valeur enti<74>re.
|
|||
|
</DD>
|
|||
|
<DT><b>rand()</b></DT><DD>Renvoie un nombre flottant compris entre z<>ro et juste inf<6E>rieur <20> un ou, en termes math<74>matiques, l'intervalle [0,1]. La graine vient de l'horloge interne de la machine ou peut <20>tre fix<69>e manuelllement avec la fonction <b>srand</b>.
|
|||
|
</DD>
|
|||
|
<DT><b>round(</b><i>arg</i><b>)</b></DT><DD>Si <i>arg</i> est une valeur enti<74>re, retourne <i>arg</i>, autrement convertit <i>arg</i> en entier arrondi et retourne la valeur convertie.
|
|||
|
</DD>
|
|||
|
<DT><b>sin(</b><i>arg</i><b>)</b></DT><DD>Renvoie le sinus de <i>arg</i>, mesur<75> en radians.
|
|||
|
</DD>
|
|||
|
<DT><b>sinh(</b><i>arg</i><b>)</b></DT><DD>Renvoie le sinus hyperbolique de <i>arg</i>. Si r<>sultat cause un d<>bordement, une erreur est renvoy<6F>e.
|
|||
|
</DD>
|
|||
|
<DT><b>sqrt(</b><i>arg</i><b>)</b></DT><DD>Renvoie la racine carr<72>e de <i>arg</i>. <i>Arg</i> doit <20>tre non-n<>gatif.
|
|||
|
</DD>
|
|||
|
<DT><b>srand(</b><i>arg</i><b>)</b></DT><DD>Le <i>arg</i>, qui doit <20>tre un entier, est utilis<69> pour r<>initialiser la graine du generateur de nombre al<61>atoire. Renvoie le premier nombre al<61>atoire de cette graine. Chaque interpr<70>teur a sa propre graine.
|
|||
|
</DD>
|
|||
|
<DT><b>tan(</b><i>arg</i><b>)</b></DT><DD>Renvoie la tangente de <i>arg</i>, mesur<75>e en radians.
|
|||
|
</DD>
|
|||
|
<DT><b>tanh(</b><i>arg</i><b>)</b></DT><DD>Renvoie la tangente hyperbolique de <i>arg</i>. </DD>
|
|||
|
</DL>
|
|||
|
</div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">En plus de ces fonctions pr<70>d<EFBFBD>finies, les applications peuvent definir des fonctions additionelles en utilisant <A HREF="22.htm"><b>Tcl_CreateMathFunc</b></A>().
|
|||
|
</div><br>
|
|||
|
<div><b>TYPES, DEBORDEMENT, ET PRECISION</b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Tous les calculs internes impliquant des entiers sont fait avec le type C <i>long</i>, et tous calculs internes impliquant des flottants sont fait avec le type C <i>double</i>. Pendant la conversion d'une cha<68>ne en valeur flottante, le d<>bordement d'exposant est d<>tect<63> et donne une erreur Tcl. Pour la conversion d'une cha<68>ne en entier, la detection du d<>bordement depend du comportement de quelques routines dans la biblioth<74>que C locale, donc il doit <20>tre consid<69>r<EFBFBD> comme non fiable. Dans tous les cas, le d<>bordement entier n'est g<>n<EFBFBD>ralement pas d<>tect<63> avec fiabilit<69> dans les r<>sultats interm<72>diaires. Le d<>bordement flottant est d<>tect<63> par le mat<61>riel, qui est g<>n<EFBFBD>ralement fiable. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">La conversion dans les representations internes des op<6F>randes entiers, flottants, et cha<68>nes est faite automatiquement si besoin. Pour les calculs arithm<68>tiques, les entiers sont utilis<69>s jusqu'a ce qu'un nombre flottant soit introduit, apr<70>s lequel les flottants sont utilis<69>s. Par exemple, </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr 5 / 4</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">renvoie 1, alors que </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr 5 / 4.0</b><br>
|
|||
|
<b>expr 5 / ( [string length "abcd"] + 0.0 )</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">renvoient 1.25. Les valeurs flottantes sont toujours renvoy<6F>es avec un "<b>.</b>" ou un <b>e</b> ainsi elles ne ressemblent pas aux valeur enti<74>res. Par exemple, </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr 20.0/5.0</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">retourne <b>4.0</b>, pas <b>4</b>.
|
|||
|
</div><br>
|
|||
|
<div><b>OPERATIONS SUR DES CHAINES </b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Les valeurs cha<68>ne peuvent <20>tre employ<6F>es comme op<6F>randes des op<6F>rateurs de comparaison, bien que l'evaluateur d'expression essaye de comparer si possible des entiers ou des flottants. Si un des op<6F>randes d'une comparaison est une cha<68>ne et que l'autre a une valeur num<75>rique, l'op<6F>rande num<75>rique est converti en une cha<68>ne en utilisant le sp<73>cificateur de format C <i>sprintf</i> <b>%d</b> pour les entiers et <b>%g</b> pour les valeurs flottantes. Par exemple, les commandes </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>expr {"0x03" > "2"}</b><br>
|
|||
|
<b>expr {"0y" < "0x12"}</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">renvoient toutes les deux 1. La premi<6D>re comparaison est faite en utilisant la comparaison enti<74>re, et la seconde est faite en utilisant la comparaison de cha<68>nes apr<70>s que le second op<6F>rande ait <20>t<EFBFBD> converti en la cha<68>ne <b>18</b>. parce que Tcl a tendance a traiter les valeurs comme des nombres chaque fois que possible, ce n'est g<>n<EFBFBD>ralement pas une bonne id<69>e d'utiliser des operateurs comme <b>==</b> quand vous desirez une comparaison de cha<68>nes et les valeurs des op<6F>randes pourraient <20>tre arbitraires; il est pr<70>f<EFBFBD>rable dans ces cas d'utiliser la commande <A HREF="165.htm"><b>string</b></A> .
|
|||
|
</div><br>
|
|||
|
<div><b>CONSIDERATIONS DE PERFORMANCE </b></div><br>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Entourez les expressions d'accolades pour la rapidit<69> et le stockage le moins encombrant. Ceci permet au compilateur bytecode Tcl de g<>n<EFBFBD>rer le meilleur code. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">Comme mentionn<6E> plus haut, les expressions sont substitu<74>es deux fois: une fois par l'analyseur Tcl et une fois par la commande<b> expr</b>. Par exemple, les commandes </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 102px;"><b>set a 3</b><br>
|
|||
|
<b>set b {$a + 2}</b><br>
|
|||
|
<b>expr $b*4</b></div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">retourne 11, pas un multiple de 4. Ceci parce que l'analyseur Tcl substituera en premier <b>$a + 2</b> pour la variable <b>b</b>, ensuite la commande <b>expr</b> evaluera l'expression <b>$a + 2*4</b>. </div>
|
|||
|
<div ALIGN="LEFT" style="margin-left: 51px;">La plupart des expressions n'exigent pas une seconde passe de substitutions. Soit elles sont entour<75>es d'accolades ou, sinon, leurs substitutions de variable et de commandes donnent des nombres ou des cha<68>nes qui eux-m<>me n'exigent pas de substitutions. N<>anmoins, parce que quelques expressions non entour<75>es d'accolades n<>c<EFBFBD>ssitent deux passes de substitutions, le compilateur bytecode doit emettre des instructions suppl<70>mentaires pour g<>rer cette situation. Le code le plus couteux est requis pour les expressions non entour<75>es d'accolades qui contiennent des substitutions de commandes. Ces expressions doivent <20>tre impl<70>ment<6E>es par la g<>n<EFBFBD>ration de nouveau code chaque fois que l'expression est ex<65>cut<75>e. </div><br>
|
|||
|
<div>Derni<EFBFBD>re r<>vision: 8.3</div>
|
|||
|
<br>
|
|||
|
<br><div ALIGN="CENTER"><A HREF="index.htm"><b>Index</b></A> <A HREF="106.htm"><b>Pr<EFBFBD>c<EFBFBD>dent</b></A> <A HREF="108.htm"><b>Suivant</b></A>
|
|||
|
</div>
|
|||
|
</BODY></HTML>
|
|||
|
|