Приоритет и ассоциативность операций языка Си влияют на порядок группирования операндов и вычисления операций в выражении. Приоритет операций существен только при наличии нескольких операций, имеющих различный приоритет. Выражения с более приоритетными операциями вычисляются первыми.
В таблице 4.1 приведены операции в порядке убывания приоритета. Операции, расположенные в одной строке таблицы, или объединенные в одну группу, имеют одинаковый приоритет и одинаковую ассоциативность.
Таблица 4.1.
Приоритет и ассоциативность операций в языке Си
Знак операции |
Наименование |
Ассоциативность |
() [] . -> |
Первичные |
Слева направо |
+ - ~ ! * & ++ -- sizeof приведение типа |
Унарные |
Справа налево |
* / % |
Мультипликативные |
Слева направо |
+ - |
Аддитивные |
Слева направо |
>> << |
Сдвиг |
Слева направо |
< > <= >= |
Отношение |
Слева направо |
== != |
Отношение |
Слева направо |
& |
Поразрядное И |
Слева направо |
^ |
Поразрядное исключающее ИЛИ |
Слева направо |
| |
Поразрядное включающее ИЛИ |
Слева направо |
&& |
Логическое И |
Слева направо |
|| |
Логическое ИЛИ |
Слева направо |
?: |
Условная |
Справа налево |
= *= /= %= += -= <<= >>= &= |= ^= |
Простое и составное присваивание |
Справа налево |
, |
Последовательное вычисление |
Слева направо |
Из таблицы 4.1. следует, что операнды, представляющие вызов функции, индексное выражение, выражение выбора элемента и выражение в скобках, имеют наибольший приоритет и ассоциативность слева направо. Приведение типа имеет тот же приоритет и порядок выполнения, что и унарные операции.
Выражение может содержать несколько операций одного приоритета. Когда несколько операций одного и того же уровня приоритета появляются в выражении, то они применяются в соответствии
с их ассоциативностью — либо справа налево, либо слева направо.
Следует отметить, что в языке Си принят неудачный порядок приоритета для некоторых операций, в частности для операции сдвига и поразрядных операций. Они имеют более низкий