Могут ли скобки переопределять порядок вычисления выражения?
Группировка операторов и операндов и порядок оценки являются двумя важными концепциями выражения в C++.
группирование
Для выражения с несколькими операторами способ операндов, сгруппированных с конкретными операторами, определяется приоритетом и ассоциативностью операторов и может зависеть от порядка вычисления.
порядок
В C++ только 4 оператора имеют указанный порядок вычислений (логическое И, логическое ИЛИ, условный оператор и оператор запятой). Для других операторов порядок оценки не указан.
Скобки
Круглые скобки могут переопределять приоритет и ассоциативность и, следовательно, указывать группировку составного выражения.
Тем не менее, книга Питера Готшлинга утверждает, что круглые скобки могут изменить порядок оценки. Я лично сомневаюсь в этом; Я думаю, что это ошибка! В примере из цитаты ниже, круглые скобки не говорят, какое выражение x
, y
а также z
оценивается первым, какой из них позже, а какой последним. Он только группирует выражение y + z
как левый операнд *
оператор.
Выражение, заключенное в скобки, также является выражением, например,
(x + y)
, Поскольку эта группировка по скобкам предшествует всем операторам, мы можем изменить порядок оценки в соответствии с нашими потребностями:x * (y + z)
вычисляет сложение первым. Знакомство с современным C++, глава 1.4.1
Вопрос
Могут ли скобки переопределять порядок вычисления выражений?
1 ответ
Приведенное предложение плохо сформулировано. Автор не имел в виду, что порядок оценки изменен или даже указан; Я думаю, что слово "порядок" подразумевалось с точки зрения того, как человек может прочитать выражение (то есть приоритет).
Конечно, если три переменные являются независимыми и чтение их не имеет побочных эффектов, правило "как будто" делает неопределенный порядок неактуальным, так как это не изменит значение выражения.