Операторы
Сначала наивысший приоритет. Все бинарные операторы левоассоциативны: a - b - c — это
(a - b) - c.
| Уровень | Операторы | Значение | Типы операндов |
|---|---|---|---|
| 1 | ( ) f(…) | группировка, вызов встроенной функции | |
| 2 | ! - ~ (унарные) | логическое НЕ, смена знака, битовое НЕ | !: любой · -: Integer/Real · ~: Integer |
| 3 | * / | умножение, деление | Integer/Real |
| 4 | + - | сложение или конкатенация, вычитание | Integer/Real или Text + Text |
| 5 | << >> | сдвиг влево, арифметический сдвиг вправо | Integer |
| 6 | < <= > >= | сравнение порядка | два числа или два Text |
| 7 | == != | равенство | любые |
| 8 | & | битовое И | Integer |
| 9 | ^ | битовое исключающее ИЛИ | Integer |
| 10 | | | битовое ИЛИ | Integer |
| 11 | && | логическое И (обе стороны вычисляются всегда) | любые (истинность) |
| 12 | || | логическое ИЛИ (обе стороны вычисляются всегда) | любые (истинность) |
Нет оператора остатка (%), возведения в степень, тернарного оператора (?:) и оператора
«запятая».
&& и || не вычисляются по короткой схеме. Оба операнда вычисляются всегда, сначала левый, затем
правый. Вызов встроенной функции справа выполняется, даже когда левая сторона уже определила
результат, и если этот вызов завершится сбоем, действие остановится. Вместо этого защищайтесь
вложенным if:
text = ClipboardGetText();
idx = StringGetIndexOf(text, ":");
// НЕВЕРНО: когда idx равно -1, StringGetSubstring(text, -1, 5) всё равно выполняется и останавливает действие
// if (idx >= 0 && StringGetSubstring(text, idx, 5) == ":here") { ... }
// ВЕРНО: вторая проверка выполняется, только когда первая истинна
if (idx >= 0) {
if (StringGetSubstring(text, idx, 5) == ":here") UtilityPrint("found");
}
Битовые операторы связывают слабее, чем сравнения (как в C). flags & 4 == 4 читается как
flags & (4 == 4), то есть flags & true, что равно 0. Всегда заключайте маску в скобки:
(flags & 4) == 4 или (flags & 4) != 0.
Сравнения не образуют цепочек. 0 < x < 10 читается как (0 < x) < 10, где Bool сравнивается
с Integer, и результат всегда false. Пишите x > 0 && x < 10.