Приоритет операций в С++

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

Если операции имеют одинаковый приоритет, то очерёдность выполнения таких операций определяется согласно свойству ассоциативности. 

Ассоциативность — направление выполнения операций в случае, если операции имеют одинаковый приоритет.

В таблице 1 показаны основные операции в С++, их приоритет выполнения и ассоциативность.

Таблица 1 — Приоритет операций в С++
Приоритет Операция Ассоциативность Описание
1 :: слева направо унарная операция разрешения области действия
[ ] операция индексирования
() круглые скобки
. обращение к члену структуры или класса
-> обращение к члену структуры или класса через указатель
2 ++ слева направо постфиксный инкремент
постфиксный декремент
3 ++ справа налево префиксный инкремент
префиксный декремент
4 * слева направо умножение
/ деление
% остаток от деления
5 + слева направо сложение
вычитание
6 >> слева направо сдвиг вправо
<< сдвиг влево
7 < слева направо меньше
<= меньше либо равно
> больше
>= больше либо равно
8 == слева направо равно
!= не равно
9 && слева направо логическое И
10 || слева направо логическое ИЛИ
11 ?: справа налево условная операция (тернарная операция)
12 = справа налево присваивание
*= умножение с присваиванием
/= деление с присваиванием
%= остаток от деления с присваиванием
+= сложение с присваиванием
-= вычитание с присваиванием
13 , слева направо запятая

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

// не правильное выражение
int value = 5;
cout << value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3

Компилятор не поймет выражения в строке 3, так как операция сдвига влево имеет больший приоритет нежели операция суммирования с присваиванием. В итоге программу с таким выражением даже нельзя будет запустить. Суть в том, что компилятор понимает это выражение не так как мы, а совсем по-другому. Как будет рассуждать компилятор: «В выражении две операции, причём первая операция << имеет больший приоритет, чем вторая +=, значит передам сначала в поток вывода значение переменной value, а потом прибавлю 3 к ?????? А не к чему прибавить 3, так как переменная value передаётся в поток вывода.» Вот в этом и заключается ошибка, а чтобы её не было необходимо просто поставить круглые скобки.

// правильное выражение
int value = 5;
cout << (value += 3); // передаем в поток вывода значение переменной value + 3

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

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. Александр Безрук

    А где же операция разыменования (косвенности), операция «&-адрес», операция приведения к типу?Здесь более полная таблица        http://ru.cppreference.com/w/cpp/language/operator_precedence

  2. Артур Леонов

    не могу понять, как использовать » :: » и в чём.

  3. NaikoN

    Согласно рис.1 операция с меньшим приоритетам имеют более высокий приоритет при выполнении программы???

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.