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