Перейти к основному содержимому

Операторы

Сначала наивысший приоритет. Все бинарные операторы левоассоциативны: 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||логическое ИЛИ (обе стороны вычисляются всегда)любые (истинность)

Нет оператора остатка (%), возведения в степень, тернарного оператора (?:) и оператора «запятая».

warning

&& и || не вычисляются по короткой схеме. Оба операнда вычисляются всегда, сначала левый, затем правый. Вызов встроенной функции справа выполняется, даже когда левая сторона уже определила результат, и если этот вызов завершится сбоем, действие остановится. Вместо этого защищайтесь вложенным 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");
}
warning

Битовые операторы связывают слабее, чем сравнения (как в C). flags & 4 == 4 читается как flags & (4 == 4), то есть flags & true, что равно 0. Всегда заключайте маску в скобки: (flags & 4) == 4 или (flags & 4) != 0.

warning

Сравнения не образуют цепочек. 0 < x < 10 читается как (0 < x) < 10, где Bool сравнивается с Integer, и результат всегда false. Пишите x > 0 && x < 10.