Когда несколько операций в одном выражении, каждая
операция вычисляется и выполняется в заданном порядке. Это называется
приоритетом операторов.
Если оператор в выражении имеет более высокий приоритет, он вычисляется
перед оператором с более низким приоритетом.
Если операторы имеют одинаковый приоритет, тогда они оцениваются в
порядке их ассоциативности. Ассоциативность может быть слева-направо или
справа-налево.
Как правило, бинарные операторы (такие как
+,
^)
и унарные постфиксные операторы (такие как
(),
->)
вычисляются слева-направо, а унарные префиксные операторы (такие как
Not,
@)
оцениваются справа-налево.
Операторы, у которых ассоциативность "N/A", указывает, что не
существует выражения, в котором данный оператор должен быть проверен на
предмет приоритета или ассоциативностьи. Операторы , похожие на функции
, такие как
Cast , всегда
оцениваются первыми из-за скобок, необходимых в их синтаксисе. А
операторы присваивания всегда оцениваются последними.
Круглые скобки могут использоваться, чтобы изменить приоритет оператора.
Операции в круглых скобках выполняются перед другими операциями. В самих
круглых скобках используется нормальный приоритет между операторами.
В следующей таблице перечислены приоритеты операторов от самого высокого
до самого низкого. Перерывы в таблице отмечают группы операторов,
имеющих равный приоритет.
Наивысший приоритет
| Оператор |
Описание | Ассоциативность |
| | | |
| CAST |
Преобразование типа | N/A |
| PROCPTR | Указатель
на процедуру | N/A |
| STRPTR | Указатель на
строку | N/A |
| VARPTR | Указатель на переменную | N/A |
|
| | |
| [] | Индекс строки |
Слева-направо |
| [] | Индекс указателя |
Слева-направо |
| () | Индекс массива |
Слева-направо |
| () | Вызов функции |
Слева-направо |
| . | Доступ к элементу |
Слева-направо |
| -> | Доступ к элементу по
указателю | Слева-направо |
| | | |
| @ |
Получение адреса | Справа-налево |
| * | Значение
из | Справа-налево |
| New | Выделение памяти |
Справа-налево |
| Delete | Освобождение памяти |
Справа-налево |
| | | |
| ^ |
Степень | Слева-направо |
| | | |
| - |
Инвертирование | Справа-налево |
| | | |
| * |
Умножение | Слева-направо |
| / | Деление |
Слева-направо |
| | | |
| \ |
Целочисленное деление | Слева-направо |
| | |
|
| MOD | Модуль числа |
Слева-направо |
| | | |
| SHL |
Сдвиг бит влево | Слева-направо |
| SHR | Сдвиг бит
вправо | Слева-направо |
| | | |
| + |
Сложение | Слева-направо |
| - | Вычитание |
Слева-направо |
| | | |
| & |
Объединение строк | Слева-направо |
| | |
|
| Is | Получение информации о типе
RinTime | N/A |
| |
| |
| = | Равно | Слева-направо |
| <> |
Не равно | Слева-направо |
| < |
Меньше | Слева-направо |
| <= | Меньше или
равно | Слева-направо |
| >= | Больше или
равно | Слева-направо |
| > | Больше |
Слева-направо |
| | | |
| NOT |
Дополнение (битовое не) | Справа-налево |
|
| | |
| AND | Конъюнкция |
Слева-направо |
| | | |
| OR |
Инклюзивная дизъюнкция | Слева-направо |
| | |
|
| EQV | Эквивалентность | Слева-направо |
| IMP |
Импликация | Слева-направо |
| XOR | Эксклюзивная
дизъюнкция | Слева-направо |
| | | |
| ANDALSO |
Короткое замыкание Конъюнкция | Слева-направо |
| ORELSE |
Короткое замыкание Инклюзивная дизъюнкция | Слева-направо |
|
| | |
| = | Присваивание | N/A |
| &= |
Объединение строк с присваиванием | N/A |
| += |
Сложение с присваиванием | N/A |
| -= |
Вычитание с присваиванием | N/A |
| *= |
Умножение с присваиванием | N/A |
| /= |
Деление с присваиванием | N/A |
| \= |
Целочисленное деление с присваиванием | N/A |
| ^= |
Возведение в степень с присваиванием | N/A |
| MOD= |
Модуль числа с присваиванием | N/A |
| AND= |
Конъюнкция с присваиванием | N/A |
| EQV= |
Эквивалентность с присваиванием | N/A |
| IMP= |
Импликация с присваиванием | N/A |
| OR= |
Инклюзивная дизъюнкция с присваиванием | N/A |
| XOR= | Эксклюзивная
дизъюнкция с присваиванием | N/A |
| SHL= |
Сдвиг бит влево с присваиванием | N/A |
| SHR= |
Сдвиг бит вправо с присваиванием | N/A |
| LET |
Присваивание | N/A |
| | | |
| LET() |
Присваивание | N/A |
В некоторых случаях, порядок старшинства может вызвать путаницу или
нелогичные результаты. Вот несколько примеров:
'' попытка возвести инвертированное число в степень
-2 ^ 2
Желаемый результат: (-2) ^ 2 = 4
Фактический результат: -(2 ^ 2) = -4
'' попытка проверки битов в
числе
n And 1 <> 0
Желаемый результат: (n And 1) <> 0
Фактический результат: n And (1 <> 0)
'' попытка сдвига числа на
n+1 бит
a Shl n+1
Желаемый результат: a Shl (n + 1)
Фактический результат: (a Shl n) + 1
Для выражений, где приоритет оператора может быть неоднозначным,
рекомендуется обернуть части выражения в круглые скобки для порядка и
минимизации возможности ошибок , а также помочь другим людям лучше читать
ваш код.
См. также