Порядок оценки операндов
В выражении a + b
, a
гарантированно оценивается до b
или порядок неуказан? Я думаю, что это последнее, но я изо всех сил пытаюсь найти определенный ответ в стандарте.
Так как я не знаю, обрабатывает ли C это значение, отличное от С++, или если правила упрощения порядка упрощены в С++ 11, я собираюсь пометить этот вопрос как все три.
Ответы
Ответ 1
В С++ для пользовательских типов a + b
- вызов функции, а в стандарте указано:
§5.2.2.8 - [...] Порядок оценки аргументов функции не указан. [...]
Для нормальных операторов стандарт говорит:
§5.4. За исключением тех случаев, когда отмечено, порядок оценки операндов отдельных операторов и подвыражений отдельных выражений и порядок, в котором происходят побочные эффекты, неуказан. [...]
Они не были изменены для С++ 11. Тем не менее, формулировка меняется во втором, чтобы сказать, что порядок "непересекающийся", а не неопределенный, но он по существу тот же.
У меня нет копии стандарта C, но я полагаю, что он тоже такой же.
Ответ 2
Это Unspecified.
Ссылка - С++ 03 Стандарт:
Раздел 5: Выражения, Параграф 4:
за исключением случаев, отмеченных [например, специальные правила для && и ||], порядок оценки операндов отдельных операторов и подвыражений отдельных выражений и порядок, в котором происходят побочные эффекты, Unspecified.
Ответ 3
Не указано. C и С++ следуют той же логике при выборе точек последовательности:
https://en.wikipedia.org/wiki/Sequence_point
Ответ 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) В выражении, которое оценивается более одного раза во время выполнение программы, непересекающиеся и неопределенно упорядоченные оценки его подвыражений не должны выполняться последовательно в разных оценках.