Opérateurs
De la priorité la plus haute à la plus basse. Tous les opérateurs binaires sont associatifs à
gauche : a - b - c équivaut à (a - b) - c.
| Niveau | Opérateurs | Signification | Types des opérandes |
|---|---|---|---|
| 1 | ( ) f(…) | regroupement, appel de fonction intégrée | |
| 2 | ! - ~ (unaires) | non logique, opposé, non bit à bit | ! : tous · - : Integer/Real · ~ : Integer |
| 3 | * / | multiplication, division | Integer/Real |
| 4 | + - | addition ou concaténation, soustraction | Integer/Real, ou Text + Text |
| 5 | << >> | décalage à gauche, décalage arithmétique à droite | Integer |
| 6 | < <= > >= | ordre | deux nombres, ou deux Text |
| 7 | == != | égalité | tous |
| 8 | & | ET bit à bit | Integer |
| 9 | ^ | OU exclusif bit à bit | Integer |
| 10 | | | OU bit à bit | Integer |
| 11 | && | ET logique (les deux côtés sont toujours évalués) | tous (valeur de vérité) |
| 12 | || | OU logique (les deux côtés sont toujours évalués) | tous (valeur de vérité) |
Il n'y a ni modulo (%), ni opérateur de puissance, ni opérateur ternaire (?:), ni opérateur
virgule.
&& et || ne court-circuitent pas. Les deux opérandes sont toujours évalués, de gauche à droite.
Un appel de fonction intégrée à droite s'exécute même quand le côté gauche a déjà décidé du
résultat, et si cet appel échoue, l'action s'arrête. Protégez-vous plutôt avec un if imbriqué :
text = ClipboardGetText();
idx = StringGetIndexOf(text, ":");
// FAUX : quand idx vaut -1, StringGetSubstring(text, -1, 5) s'exécute quand même et arrête l'action
// if (idx >= 0 && StringGetSubstring(text, idx, 5) == ":here") { ... }
// JUSTE : le second test ne s'exécute que si le premier est vrai
if (idx >= 0) {
if (StringGetSubstring(text, idx, 5) == ":here") UtilityPrint("found");
}
Les opérateurs bit à bit ont une priorité plus faible que les comparaisons (comme en C).
flags & 4 == 4 est lu comme flags & (4 == 4), c'est-à-dire flags & true, qui vaut 0.
Mettez toujours le masque entre parenthèses : (flags & 4) == 4 ou (flags & 4) != 0.
Les comparaisons ne s'enchaînent pas. 0 < x < 10 est lu comme (0 < x) < 10, qui compare un
Bool à un Integer et vaut toujours false. Écrivez x > 0 && x < 10.