C++, приоритет операторов

81
26 декабря 2021, 07:00

Рассмотрим следующий пример:

if (a() == b && c > d)
{
    // ...
}

Таблица приоритетов операций говорит следующее:

  • ==: 9, слева направо;
  • &&: 13, слева направо;
  • >: 8, слева направо.

Мне интуитивно понятно, что левая часть оператора && должна выполняться первой. Если слева true, тогда выполняется правая часть. На практике так и происходит.

Но если верить таблице, то в первую очередь должна выполняться операция с наивысшим приоритетом, то есть >.

В Стандарте не определен порядок приоритетов. Этот порядок выводится из грамматики языка. Я не понимаю, что это значит.

Буду очень благодарен, если кто-нибудь поможет разобраться в данном вопросе.

Answer 1

левая часть оператора && должна выполняться первой. Если слева true, тогда выполняется правая часть

Правильно.

если верить таблице, то в первую очередь должна выполняться операция с наивысшим приоритетом

А здесь ошибка.

Приоритет и порядок вычисления - разные вещи. Приоритет, грубо говоря, влияет на воображаемую "расстановку скобок" в выражении.

Раз у && приоритет ниже == и >, то из a() == b && c > d получается (a() == b) && (c > d).

А дальше в дело вспупает порядок вычисления:

very value computation and side effect of the first (left) argument of the built-in logical AND operator && and the built-in logical OR operator || is sequenced before every value computation and side effect of the second (right) argument.

Answer 2

Сначала первая часть до И(&&) потом вторая (в случает если первая true). Данное поведение не зависит от приоритета, а от порядка. Ваша запись эквивалента

if (a() == b) {
    if (c > d) { 
         ...some code...
    }
} 

И тут все выполняется исключительно по прямому порядку выполнения команд

READ ALSO
Как поменять "e+..." на знак степени "10^..."

Как поменять "e+..." на знак степени "10^..."

Например у меня есть число

95
c# конвертация кодировки

c# конвертация кодировки

Требуется программа которая будет текст из 1252 переводить в 1251

144
ADO.NET SCOPE_IDENTITY() Возвращает NULL

ADO.NET SCOPE_IDENTITY() Возвращает NULL

Что-то всё работало, а потом поломався! Данными база заполненаВсё работало

81
Смена сцены приводит к искажению виджета

Смена сцены приводит к искажению виджета

Когда выбираю в меню виджет интеграции с картами он выглядит так:

79