prénom
expr - Evalue une expression
Synopsis
expr se disputer ? arg arg … ?
Concatène se disputer (ajout d'espaces séparateurs entre eux), évalue le résultat en tant qu'expression Tcl et renvoie la valeur. Les opérateurs autorisés dans les expressions Tcl sont un sous-ensemble des opérateurs autorisés dans les expressions C et ont la même signification et la même priorité que les opérateurs C. correspondants. Les expressions donnent presque toujours des résultats numériques (valeurs entières ou à virgule flottante). Par exemple, l'expression
expr 8.2 + 6
évalue à 14.2. Les expressions Tcl diffèrent des expressions C par la manière dont les opérandes sont spécifiés. En outre, les expressions Tcl prennent en charge les opérandes non numériques et les comparaisons de chaînes.
Opérandes
Une expression Tcl consiste en une combinaison d'opérandes, d'opérateurs et de parenthèses. Un espace blanc peut être utilisé entre les opérandes et les opérateurs et les parenthèses; il est ignoré par les instructions de l'expression. Dans la mesure du possible, les opérandes sont interprétés comme des valeurs entières. Les valeurs entières peuvent être spécifiées en décimal (cas normal), en octal (si le premier caractère de l'opérande est0), ou en hexadécimal (si les deux premiers caractères de l’opérande sont0x). Si un opérande n'a pas l'un des formats d'entiers indiqués ci-dessus, il est traité comme un nombre à virgule flottante si cela est possible. Les nombres en virgule flottante peuvent être spécifiés de n’importe quelle façon acceptée par un compilateur C conforme à la norme ANSI (sauf queF, F, l, etL les suffixes ne seront pas autorisés dans la plupart des installations). Par exemple, tous les éléments suivants sont des nombres à virgule flottante valides: 2.1, 3., 6e4, 7.91e + 16. Si aucune interprétation numérique n'est possible, alors un opérande est laissé sous forme de chaîne (et seul un ensemble limité d'opérateurs peut lui être appliqué).
Les opérandes peuvent être spécifiés de l'une des manières suivantes:
1
En valeur numérique, entier ou virgule flottante.
2
En tant que variable Tcl, en utilisant standard$ notation. La valeur de la variable sera utilisée comme opérande.
3
En tant que chaîne entre guillemets. L'analyseur d'expression effectuera des substitutions de barre oblique inverse, de variable et de commande sur les informations entre les guillemets, et utilisera la valeur résultante comme opérande.
4
Comme une chaîne entourée d'accolades. Les caractères entre l'accolade ouverte et l'accolade proche correspondante seront utilisés comme opérande sans aucune substitution.
5
En tant que commande Tcl entre parenthèses. La commande sera exécutée et son résultat sera utilisé comme opérande.
6
En tant que fonction mathématique dont les arguments ont l'une des formes ci-dessus pour les opérandes, tels quepéché ($ x). Voir ci-dessous pour une liste des fonctions définies.
Lorsque des substitutions se produisent ci-dessus (par exemple, à l'intérieur de chaînes citées), elles sont effectuées par les instructions de l'expression. Cependant, une couche supplémentaire de substitution peut déjà avoir été effectuée par l'analyseur de commande avant l'appel du processeur d'expression. Comme indiqué ci-dessous, il est généralement préférable de placer des expressions entre accolades afin d'empêcher l'analyseur de commande d'effectuer des substitutions sur le contenu.
Pour quelques exemples d'expressions simples, supposons que la variableune a la valeur 3 et la variableba la valeur 6. Ensuite, la commande à gauche de chacune des lignes ci-dessous produira la valeur à droite de la ligne:
expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * durée "6 2" 8 expr {{mot un} <<mot $ a "} 0
Les opérateurs
Les opérateurs valides sont énumérés ci-dessous, regroupés par ordre de priorité décroissant:
- + ~ !
Moins unaire, unaire plus, bit non pas logique, pas logique. Aucun de ces opérandes ne peut être appliqué à des opérandes de chaîne, et NOT au niveau du bit ne peut être appliqué qu'à des entiers.
* / %
Multipliez, divisez, restez. Aucun de ces opérandes ne peut être appliqué à des opérandes de chaîne et le reste ne peut être appliqué qu'à des entiers. Le reste aura toujours le même signe que le diviseur et une valeur absolue inférieure à celle du diviseur.
+ -
Ajouter et soustraire. Valable pour tous les opérandes numériques.
<< >>
Décalage gauche et droit. Valable pour les opérandes entiers uniquement. Un décalage à droite propage toujours le bit de signe.
< > <= >=
Booléen inférieur, supérieur, inférieur ou égal et supérieur ou égal. Chaque opérateur produit 1 si la condition est vraie, 0 sinon. Ces opérateurs peuvent être appliqués aux chaînes ainsi qu'aux opérandes numériques, auquel cas la comparaison de chaînes est utilisée.
== !=
Booléen égal et non égal. Chaque opérateur produit un résultat zéro / un. Valable pour tous les types d'opérandes.
&
Bit-sage ET. Valable pour les opérandes entiers uniquement.
^
OU exclusif bit par bit Valable pour les opérandes entiers uniquement.
|
Bit-sage ou. Valable pour les opérandes entiers uniquement.
&&
ET logique Produit un résultat 1 si les deux opérandes sont non nuls, 0 sinon. Valable pour les opérandes booléens et numériques (nombres entiers ou virgule flottante) uniquement.
||
OU logique. Produit un résultat 0 si les deux opérandes sont zéro, 1 sinon. Valable pour les opérandes booléens et numériques (nombres entiers ou virgule flottante) uniquement.
X ? y : z
Si-alors-sinon, comme en C. Si X évalue à non nul, alors le résultat est la valeur de y . Sinon, le résultat est la valeur de z . le X L'opérande doit avoir une valeur numérique.
Voir le manuel C pour plus de détails sur les résultats produits par chaque opérateur. Tous les opérateurs binaires se regroupent de gauche à droite dans le même niveau de priorité. Par exemple, la commande
expr 4 * 2 <7
renvoie 0.
le&&, ||, et?: les opérateurs ont «évaluation paresseuse», comme en C, ce qui signifie que les opérandes ne sont pas évalués s'ils ne sont pas nécessaires pour déterminer le résultat. Par exemple, dans la commande
expr {$ v? un B}
un seul desune oub sera effectivement évalué, en fonction de la valeur de$ v. Notez cependant que cela n’est vrai que si l’expression entière est entourée d’accolades; sinon, l'analyseur Tcl évaluera les deuxune etb avant d'invoquer leexpr commander.
Fonctions mathématiques
Tcl supporte les fonctions mathématiques suivantes dans les expressions:
abdos matraquebûchesqrt acos doublelog10srand un péché exppowbronzer un bronzage solrandtanh atan2 fmodrond plafond hypotpéché cos intsinh
abdos( se disputer )
Renvoie la valeur absolue de se disputer . Arg peut être soit un nombre entier, soit un nombre à virgule flottante, et le résultat est renvoyé sous la même forme.
acos ( se disputer )
Renvoie l'arc cosinus de se disputer , dans la gamme 0, pi radians. Arg devrait être dans l'intervalle -1,1.
un péché( se disputer )
Renvoie l'arc sinus de se disputer , dans la gamme -pi / 2, pi / 2 radians. Arg devrait être dans l'intervalle -1,1.
un bronzage( se disputer )
Renvoie l'arc tangente de se disputer , dans la gamme -pi / 2, pi / 2 radians.
atan2 ( x, y )
Renvoie l'arc tangente de y / X , dans la gamme -pi, pi radians. X et y les deux ne peuvent pas être 0.
ceil ( se disputer )
Renvoie la plus petite valeur entière non inférieure à se disputer .
cos ( se disputer )
Renvoie le cosinus de se disputer , mesurée en radians.
matraque( se disputer )
Renvoie le cosinus hyperbolique de se disputer . Si le résultat provoque un débordement, une erreur est renvoyée.
double( se disputer )
Si se disputer est une valeur flottante, renvoie se disputer , sinon convertit se disputer flottant et renvoie la valeur convertie.
exp ( se disputer )
Renvoie l'exponentielle de se disputer , défini comme e ** se disputer . Si le résultat provoque un débordement, une erreur est renvoyée.
sol( se disputer )
Renvoie la plus grande valeur intégrale non supérieure à se disputer .
fmod ( x, y )
Renvoie le reste en virgule flottante de la division de X par y . Si y est 0, une erreur est renvoyée.
hypot ( x, y )
Calcule la longueur de l'hypoténuse d'un triangle rectangle ( X * X + y * y ).
int ( se disputer )
Si se disputer est une valeur entière, retourne se disputer , sinon convertit se disputer en entier par troncature et renvoie la valeur convertie.
bûche( se disputer )
Renvoie le logarithme naturel de se disputer . Arg doit être une valeur positive.
log10 ( se disputer )
Renvoie le logarithme en base 10 de se disputer . Arg doit être une valeur positive.
pow ( x, y )
Calcule la valeur de X élevé au pouvoir y . Si X est négatif, y doit être une valeur entière.
rand()
Renvoie un nombre à virgule flottante compris entre zéro et un peu moins de un ou, en termes mathématiques, la plage 0,1). La graine provient de l'horloge interne de la machine ou peut être réglée manuellement avec la fonction srand.
rond( se disputer )
Si se disputer est une valeur entière, retourne se disputer , sinon convertit se disputer en entier en arrondissant et retourne la valeur convertie.
péché( se disputer )
Renvoie le sinus de se disputer , mesurée en radians.
sinh ( se disputer )
Renvoie le sinus hyperbolique de se disputer . Si le résultat provoque un débordement, une erreur est renvoyée.
sqrt ( se disputer )
Renvoie la racine carrée de se disputer . Arg doit être non négatif.
srand ( se disputer )
le se disputer , qui doit être un entier, est utilisé pour réinitialiser le germe du générateur de nombres aléatoires. Retourne le premier nombre aléatoire de cette graine. Chaque interprète a sa propre graine.
bronzer( se disputer )
Renvoie la tangente de se disputer , mesurée en radians.
tanh ( se disputer )
Renvoie la tangente hyperbolique de se disputer .
Outre ces fonctions prédéfinies, les applications peuvent définir des fonctions supplémentaires à l'aide deTcl_CreateMathFunc().
Types, débordement et précision
Tous les calculs internes impliquant des entiers sont effectués avec le type C longue , et tous les calculs internes impliquant une virgule flottante sont effectués avec le type C double . Lors de la conversion d'une chaîne en virgule flottante, un dépassement d'exposant est détecté et génère une erreur Tcl. Pour la conversion en entier de chaîne, la détection de dépassement de capacité dépend du comportement de certaines routines de la bibliothèque C locale. Elle doit donc être considérée comme non fiable. Dans tous les cas, les débordements entiers et les débordements ne sont généralement pas détectés de manière fiable pour les résultats intermédiaires. Les dépassements et dépassements en virgule flottante sont détectés dans la mesure prise en charge par le matériel, ce qui est généralement assez fiable.
La conversion entre les représentations internes pour les opérandes de nombre entier, virgule flottante et chaîne est effectuée automatiquement selon les besoins. Pour les calculs arithmétiques, les entiers sont utilisés jusqu'à ce qu'un nombre en virgule flottante soit introduit, après quoi le nombre en virgule flottante est utilisé. Par exemple,
expr 5/4
renvoie 1, tandis que
expr 5 / 4.0 expr 5 / (longueur de chaîne "abcd" + 0.0)
les deux retournent 1.25. Les valeurs en virgule flottante sont toujours renvoyées avec un ``.'' ou une afin qu'ils ne ressemblent pas à des valeurs entières. Par exemple,
expr 20.0 / 5.0
résultats4.0, ne pas4.
Opérations sur les chaînes
Les valeurs de chaîne peuvent être utilisées comme opérandes des opérateurs de comparaison, bien que l'évaluateur d'expressions tente d'effectuer des comparaisons sous forme d'entier ou de virgule flottante lorsqu'il le peut. Si l’un des opérandes d’une comparaison est une chaîne et que l’autre a une valeur numérique, l’opérande numérique est reconverti en une chaîne à l’aide de C sprintf spécificateur de format%ré pour les entiers et%g pour les valeurs à virgule flottante. Par exemple, les commandes
expr {"0x03"> "2"} expr {"0y" <"0x12"}
les deux retournent 1. La première comparaison est effectuée à l'aide de la comparaison d'entiers, et la seconde à l'aide de la comparaison de chaînes après la conversion du deuxième opérande en chaîne.18. En raison de la tendance de Tcl à traiter les valeurs comme des nombres chaque fois que cela est possible, il n’est généralement pas recommandé d’utiliser des opérateurs tels que==quand vous voulez vraiment une comparaison de chaînes et que les valeurs des opérandes peuvent être arbitraires; il vaut mieux dans ces cas utiliser lechaîne commande à la place.
Considérations de performance
Placez les expressions entre accolades pour optimiser la vitesse et les besoins de stockage. Cela permet au compilateur de bytecode de Tcl de générer le meilleur code.
Comme mentionné ci-dessus, les expressions sont substituées deux fois: une fois par l’analyseur Tcl et une fois par expr commander. Par exemple, les commandes
définir un 3 set b {$ a + 2} expr $ b * 4
retour 11, pas un multiple de 4. C'est parce que l'analyseur Tcl va d'abord remplacer$ a + 2 pour la variableb, puis leexpr commande évaluera l'expression$ a + 2 * 4.
La plupart des expressions ne nécessitent pas une deuxième série de substitutions. Soit ils sont entourés d'accolades, soit, sinon, leurs substitutions de variable et de commande génèrent des nombres ou des chaînes qui ne nécessitent pas elles-mêmes de substitution. Cependant, étant donné que quelques expressions non substituées nécessitent deux séries de substitutions, le compilateur de code intermédiaire doit émettre des instructions supplémentaires pour gérer cette situation. Le code le plus coûteux est requis pour les expressions non substituées contenant des substitutions de commandes. Ces expressions doivent être implémentées en générant un nouveau code à chaque exécution de l'expression.
Mots clés
arithmétique, booléen, comparer, expression, comparaison floue
Important: Utilisez le homme commande ( % homme ) pour voir comment une commande est utilisée sur votre ordinateur.