Рассмотрим следующий пример:
if (a() == b && c > d)
{
// ...
}
Таблица приоритетов операций говорит следующее:
==: 9, слева направо;&&: 13, слева направо;>: 8, слева направо.Мне интуитивно понятно, что левая часть оператора && должна выполняться первой. Если слева true, тогда выполняется правая часть. На практике так и происходит.
Но если верить таблице, то в первую очередь должна выполняться операция с наивысшим приоритетом, то есть >.
В Стандарте не определен порядок приоритетов. Этот порядок выводится из грамматики языка. Я не понимаю, что это значит.
Буду очень благодарен, если кто-нибудь поможет разобраться в данном вопросе.
левая часть оператора && должна выполняться первой. Если слева 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.
Сначала первая часть до И(&&) потом вторая (в случает если первая true). Данное поведение не зависит от приоритета, а от порядка. Ваша запись эквивалента
if (a() == b) {
if (c > d) {
...some code...
}
}
И тут все выполняется исключительно по прямому порядку выполнения команд
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости