Когда несколько операций в одном выражении, каждая
операция вычисляется и выполняется в заданном порядке. Это называется
приоритетом операторов.
Если оператор в выражении имеет более высокий приоритет, он вычисляется
перед оператором с более низким приоритетом.
Если операторы имеют одинаковый приоритет, тогда они оцениваются в
порядке их ассоциативности. Ассоциативность может быть слева-направо или
справа-налево.
Как правило, бинарные операторы (такие как
+,
^)
и унарные постфиксные операторы (такие как
(),
->)
вычисляются слева-направо, а унарные префиксные операторы (такие как
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
Для выражений, где приоритет оператора может быть неоднозначным,
рекомендуется обернуть части выражения в круглые скобки для порядка и
минимизации возможности ошибок , а также помочь другим людям лучше читать
ваш код.
См. также