Приоритет операторов
 
Когда несколько операций в одном выражении, каждая операция вычисляется и выполняется в заданном порядке. Это называется приоритетом операторов.

Если оператор в выражении имеет более высокий приоритет, он вычисляется перед оператором с более низким приоритетом.

Если операторы имеют одинаковый приоритет, тогда они оцениваются в порядке их ассоциативности. Ассоциативность может быть слева-направо или справа-налево.

Как правило, бинарные операторы (такие как +, ^) и унарные постфиксные операторы (такие как (), ->) вычисляются слева-направо, а унарные префиксные операторы (такие как Not, @) оцениваются справа-налево.

Операторы, у которых ассоциативность "N/A",  указывает, что не существует выражения, в котором данный оператор должен быть проверен на предмет приоритета или ассоциативностьи. Операторы , похожие на функции , такие как Cast , всегда оцениваются первыми из-за скобок, необходимых в их синтаксисе. А операторы присваивания всегда оцениваются последними.

Круглые скобки могут использоваться, чтобы изменить приоритет оператора. Операции в круглых скобках выполняются перед другими операциями. В самих круглых скобках используется нормальный приоритет между операторами.

В следующей таблице перечислены приоритеты операторов от самого высокого до самого низкого. Перерывы в таблице отмечают группы операторов, имеющих равный приоритет.

Наивысший приоритет

Оператор ОписаниеАссоциативность
   
CAST Преобразование типаN/A
PROCPTRУказатель на процедуруN/A
STRPTRУказатель на строкуN/A
VARPTRУказатель на переменнуюN/A
   
[]Индекс строки Слева-направо
[]Индекс указателя Слева-направо
()Индекс массива Слева-направо
()Вызов функции Слева-направо
.Доступ к элементу Слева-направо
->Доступ к элементу по указателюСлева-направо
   
@ Получение адресаСправа-налево
*Значение изСправа-налево
NewВыделение памяти Справа-налево
DeleteОсвобождение памяти Справа-налево
   
^ СтепеньСлева-направо
   
- ИнвертированиеСправа-налево
   
* УмножениеСлева-направо
/Деление Слева-направо
   
\ Целочисленное делениеСлева-направо
    
MODМодуль числа Слева-направо
   
SHL Сдвиг бит влевоСлева-направо
SHRСдвиг бит вправоСлева-направо
   
+ СложениеСлева-направо
-Вычитание Слева-направо
   
& Объединение строкСлева-направо
    
IsПолучение информации о типе RinTimeN/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

Для выражений, где приоритет оператора может быть неоднозначным, рекомендуется обернуть части выражения в круглые скобки для порядка и минимизации возможности ошибок , а также помочь другим людям лучше читать ваш код.

См. также