Любое выражение языка состоит из операндов (переменных, констант и др.), соединенных знаками операций. Операции выполняются в строгой последовательности. Величина, определяющая преимущественное право на выполнение той или иной операции, называется приоритетом. Порядок выполнения операций может регулироваться с помощью круглых скобок.
Таблица 1. Приоритеты операций в языке Си/Си++.
В программах нередко можно встретить ошибки, связанные с тем, что точный приоритет операций легко забыть (статья на эту тему). Поэтому профессиональные разработчики не стесняются использовать дополнительные скобки. Это страхует от случайных ошибок и делает выражения более читабельными.
Примечание. В статическом анализаторе кода PVS-Studio реализовано несколько диагностик, таких как V648, которые помогают выявлять ошибки, связанные с приоритетами операций. Попробуйте проверить свой код.
Я что-то не понял. Согласно таблице приоритет постфиксного инкремента, чем у условного умножения и присваивания. То есть получается, что постфиксный инкремент выполнится раньше умножения при отсутствии скобок, и как следствие раньше присваивания. Но если я делаю, что-то вроде:
Short a =1
Short b = a++ * 2
то переменная b будет равна 2. Хотя по логике, если приоритет постфиксного инкремента выше, то сначала должен выполниться он и ответ должен быть 4.
Либо я не правильно понял таблицу, объясните, пожалуйста
Здравствуйте!
С приоритетом операторов все именно так, как и описано в таблице. Однако нужно понять отличие префиксного и постфиксного инкрементов. Постараемся объяснить простым языком.
Префиксный инкремент (++a) модифицирует переменную и возвращает в качестве результата новое значение. Постфиксный инкремент (a++) также модифицирует переменную, но возвращает в качестве результата значение до модификации.
Возьмём в качестве примера ваш код. Если мы используем постфиксный инкремент:
short a = 1;
short b = a++ * 2;
То последовательность операций следующая:
1. Значение a увеличивается на 1.
2. В качестве левого операнда умножения подставляется значение ДО модификации (т.е. 1).
3. Вычисляется умножение 1 * 2, результат равен 2.
Теперь если мы применим префиксный инкремент:
short a = 1;
short b = ++a * 2;
То последовательность операций следующая:
1. Значение a увеличивается на 1.
2. В качестве левого операнда умножения подставляется значение ПОСЛЕ модификации (т.е. 2).
3. Вычисляется умножение 2 * 2, результат равен 4.
Спасибо большое. Теперь понял суть и разницу инкрементов
Français
33.29 K