Operadores
Da precedência mais alta para a mais baixa. Todo operador binário é associativo à esquerda: a - b - c
é (a - b) - c.
| Nível | Operadores | Significado | Tipos dos operandos |
|---|---|---|---|
| 1 | ( ) f(…) | agrupamento, chamada de função interna | |
| 2 | ! - ~ (unários) | negação lógica, negação aritmética, negação bit a bit | !: qualquer · -: Integer/Real · ~: Integer |
| 3 | * / | multiplicação, divisão | Integer/Real |
| 4 | + - | adição ou concatenação, subtração | Integer/Real, ou Text + Text |
| 5 | << >> | deslocamento à esquerda, deslocamento aritmético à direita | Integer |
| 6 | < <= > >= | ordenação | dois números ou dois Texts |
| 7 | == != | igualdade | qualquer |
| 8 | & | AND bit a bit | Integer |
| 9 | ^ | XOR bit a bit | Integer |
| 10 | | | OR bit a bit | Integer |
| 11 | && | AND lógico (os dois lados são sempre avaliados) | qualquer (valor verdadeiro) |
| 12 | || | OR lógico (os dois lados são sempre avaliados) | qualquer (valor verdadeiro) |
Não há operador de módulo (%), de exponenciação, ternário (?:) nem vírgula.
&& e || não fazem curto-circuito. Os dois operandos são sempre avaliados, primeiro o da esquerda,
depois o da direita. Uma chamada de função interna à direita é executada mesmo quando o lado esquerdo
já decidiu o resultado, e, se essa chamada falhar, a ação é interrompida. Proteja-a com um if
aninhado:
text = ClipboardGetText();
idx = StringGetIndexOf(text, ":");
// ERRADO: quando idx é -1, StringGetSubstring(text, -1, 5) é executada mesmo assim e interrompe a ação
// if (idx >= 0 && StringGetSubstring(text, idx, 5) == ":here") { ... }
// CERTO: o segundo teste só é executado quando o primeiro é verdadeiro
if (idx >= 0) {
if (StringGetSubstring(text, idx, 5) == ":here") UtilityPrint("found");
}
Os operadores bit a bit têm precedência menor que as comparações (como em C). flags & 4 == 4 é
lido como flags & (4 == 4), que é flags & true, que é 0. Sempre coloque a máscara entre
parênteses: (flags & 4) == 4 ou (flags & 4) != 0.
As comparações não se encadeiam. 0 < x < 10 é lido como (0 < x) < 10, que compara um Bool com
um Integer e é sempre false. Escreva x > 0 && x < 10.