Могут ли скобки переопределять порядок вычисления выражения?

Группировка операторов и операндов и порядок оценки являются двумя важными концепциями выражения в C++.

группирование

Для выражения с несколькими операторами способ операндов, сгруппированных с конкретными операторами, определяется приоритетом и ассоциативностью операторов и может зависеть от порядка вычисления.

порядок

В C++ только 4 оператора имеют указанный порядок вычислений (логическое И, логическое ИЛИ, условный оператор и оператор запятой). Для других операторов порядок оценки не указан.

Скобки

Круглые скобки могут переопределять приоритет и ассоциативность и, следовательно, указывать группировку составного выражения.

Тем не менее, книга Питера Готшлинга утверждает, что круглые скобки могут изменить порядок оценки. Я лично сомневаюсь в этом; Я думаю, что это ошибка! В примере из цитаты ниже, круглые скобки не говорят, какое выражение x, y а также z оценивается первым, какой из них позже, а какой последним. Он только группирует выражение y + z как левый операнд * оператор.

Выражение, заключенное в скобки, также является выражением, например, (x + y), Поскольку эта группировка по скобкам предшествует всем операторам, мы можем изменить порядок оценки в соответствии с нашими потребностями: x * (y + z) вычисляет сложение первым. Знакомство с современным C++, глава 1.4.1

Вопрос

Могут ли скобки переопределять порядок вычисления выражений?

1 ответ

Решение

Приведенное предложение плохо сформулировано. Автор не имел в виду, что порядок оценки изменен или даже указан; Я думаю, что слово "порядок" подразумевалось с точки зрения того, как человек может прочитать выражение (то есть приоритет).

Конечно, если три переменные являются независимыми и чтение их не имеет побочных эффектов, правило "как будто" делает неопределенный порядок неактуальным, так как это не изменит значение выражения.

Другие вопросы по тегам