Язык программирования Си для персонального компьютера | страница 83



Приоритет и порядок выполнения

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

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

Таблица 4.1.

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

Из таблицы 4.1. следует, что операнды, представляющие вызов функции, индексное выражение, выражение выбора элемента и выражение в скобках, имеют наибольший приоритет и ассоциативность слева направо. Приведение типа имеет тот же приоритет и порядок выполнения, что и унарные операции.

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

Следует отметить, что в языке Си принят неудачный порядок приоритета для некоторых операций, в частности для операции сдвига и поразрядных операций. Они имеют более низкий приоритет, чем арифметические операции (сложение и др.). Поэтому выражение

а = b & 0xFF + 5

вычисляется как

а = b & (0xFF + 5),

а выражение

а +с >> 1

вычисляется как

(а + с) >> 1

Мультипликативные, аддитивные и поразрядные операции обладают свойством коммутативности. Это значит, что результат вычисления выражения, включающего несколько коммутативных операций одного и того же приоритета, не зависит от порядка выполнения этих операций. Поэтому компилятор оставляет за собой право вычислять такие выражения в любом порядке, даже в случае, когда в выражении имеются скобки, специфицирующие порядок вычисления.