порядок вычисления операндов - PullRequest
13 голосов
/ 18 августа 2011

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

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

Ответы [ 6 ]

11 голосов
/ 18 августа 2011

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

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

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

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

Они не были изменены для C ++ 11.Тем не менее, формулировка второго варианта говорит о том, что порядок « unsequenced », а не не указан, но по сути тот же.

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

11 голосов
/ 18 августа 2011

Это Не указано .

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

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

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

1 голос
/ 18 августа 2011

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

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

1 голос
/ 18 августа 2011

Не указано.C и C ++ следуют одинаковой логике при выборе точек последовательности:

https://en.wikipedia.org/wiki/Sequence_point

0 голосов
/ 04 декабря 2016

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

Из раздела 6.5:

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


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

0 голосов
/ 18 августа 2011

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

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

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

...