Подтвердить что ты не робот

Порядок оценки операндов

В выражении a + b, a гарантированно оценивается до b или порядок неуказан? Я думаю, что это последнее, но я изо всех сил пытаюсь найти определенный ответ в стандарте.

Так как я не знаю, обрабатывает ли C это значение, отличное от С++, или если правила упрощения порядка упрощены в С++ 11, я собираюсь пометить этот вопрос как все три.

4b9b3361

Ответ 1

В С++ для пользовательских типов a + b - вызов функции, а в стандарте указано:

§5.2.2.8 - [...] Порядок оценки аргументов функции не указан. [...]

Для нормальных операторов стандарт говорит:

§5.4. За исключением тех случаев, когда отмечено, порядок оценки операндов отдельных операторов и подвыражений отдельных выражений и порядок, в котором происходят побочные эффекты, неуказан. [...]

Они не были изменены для С++ 11. Тем не менее, формулировка меняется во втором, чтобы сказать, что порядок "непересекающийся", а не неопределенный, но он по существу тот же.

У меня нет копии стандарта C, но я полагаю, что он тоже такой же.

Ответ 2

Это Unspecified.

Ссылка - С++ 03 Стандарт:

Раздел 5: Выражения, Параграф 4:

за исключением случаев, отмеченных [например, специальные правила для && и ||], порядок оценки операндов отдельных операторов и подвыражений отдельных выражений и порядок, в котором происходят побочные эффекты, Unspecified.

Ответ 4

С++ 0x Раздел FDIS 1.9 "Выполнение программы" §15 аналогичен соответствующему абзацу в С++ 03, просто переформулирован, чтобы приспособить концептуальное изменение от "точек последовательности" до "секвенирования":

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

Ответ 5

Для C: "Порядок операций не определяется языком. Компилятор может свободно оценивать такие выражения в любом порядке, если компилятор может гарантировать согласованный результат". [...] "Только операторы последовательной оценки (,), логического-И (&), логического-ИЛИ (||), условного выражения (?:) и функционального вызова представляют собой точки последовательности и поэтому гарантируют конкретный порядок оценки для их операндов".

Источник: http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx

Как это организовано в этой статье, похоже, это относится и к С++, что подтверждается ответом на этот вопрос: Приоритет оператора и порядок оценки.

Ответ 6

В соответствии с текущим стандартом C, C11, он также указывает, что порядок оценки подвыражений (a и b в этом случае) является неопределенным. Фактически, этот порядок не обязательно должен быть одинаковым, если одно и то же выражение оценивается несколько раз.

Из раздела 6.5:

Группировка операторов и операндов обозначается синтаксис. 85) За исключением случаев, указанных ниже, побочные эффекты и вычисление значений подвыражений не имеет последствий. 86)


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