Operadores
De mayor a menor precedencia. Todos los operadores binarios son asociativos por la izquierda:
a - b - c es (a - b) - c.
| Nivel | Operadores | Significado | Tipos de operando |
|---|---|---|---|
| 1 | ( ) f(…) | agrupación, llamada a función integrada | |
| 2 | ! - ~ (unarios) | negación lógica, cambio de signo, negación bit a bit | !: cualquiera · -: Integer/Real · ~: Integer |
| 3 | * / | multiplicación, división | Integer/Real |
| 4 | + - | suma o concatenación, resta | Integer/Real, o Text + Text |
| 5 | << >> | desplazamiento a la izquierda, desplazamiento aritmético a la derecha | Integer |
| 6 | < <= > >= | orden | dos números, o dos Text |
| 7 | == != | igualdad | cualquiera |
| 8 | & | AND bit a bit | Integer |
| 9 | ^ | XOR bit a bit | Integer |
| 10 | | | OR bit a bit | Integer |
| 11 | && | AND lógico (siempre se evalúan ambos lados) | cualquiera (veracidad) |
| 12 | || | OR lógico (siempre se evalúan ambos lados) | cualquiera (veracidad) |
No hay operador de módulo (%), de potencia, ternario (?:) ni de coma.
&& y || no hacen cortocircuito. Ambos operandos se evalúan siempre, primero el izquierdo y luego
el derecho. Una llamada a función integrada a la derecha se ejecuta aunque el lado izquierdo ya haya
decidido el resultado, y si esa llamada falla, la acción se detiene. Protéjala con un if anidado:
text = ClipboardGetText();
idx = StringGetIndexOf(text, ":");
// INCORRECTO: cuando idx es -1, StringGetSubstring(text, -1, 5) se ejecuta igualmente y detiene la acción
// if (idx >= 0 && StringGetSubstring(text, idx, 5) == ":here") { ... }
// CORRECTO: la segunda comprobación solo se ejecuta cuando se cumple la primera
if (idx >= 0) {
if (StringGetSubstring(text, idx, 5) == ":here") UtilityPrint("found");
}
Los operadores bit a bit tienen menor precedencia que las comparaciones (igual que en C).
flags & 4 == 4 se lee como flags & (4 == 4), que es flags & true, que es 0. Ponga siempre la
máscara entre paréntesis: (flags & 4) == 4 o (flags & 4) != 0.
Las comparaciones no se encadenan. 0 < x < 10 se lee como (0 < x) < 10, que compara un Bool
con un Integer y siempre es false. Escriba x > 0 && x < 10.