Порядок вычисления выражения в C - PullRequest
5 голосов
/ 25 февраля 2012

Если у меня есть следующее выражение:

c = (a) * (b)

Что стандарт C90 говорит об оценке порядка подвыражения 'a' и 'b'?

Ответы [ 2 ]

11 голосов
/ 25 февраля 2012

Указанного порядка нет, поскольку оператор умножения не является точкой последовательности.Точки последовательности включают оператор запятой, конец полного выражения и вызовы функций.Таким образом, порядок оценки (a) и (b) зависит от реализации компилятора.Следовательно, вы не должны пытаться делать что-то в (a), которое будет иметь побочный эффект, который вы хотите видеть в (b), чтобы получить действительный результат.

Например:

int a=5;
int b = (a++) * (a++); //<== Don't do this!!

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

3 голосов
/ 25 февраля 2012

Порядок вычисления операндов бинарного оператора * не определен в C90.

Вот соответствующий параграф из стандарта C90 (как вопрос, заданный о C90):

(C90, 6.3) "За исключением случаев, обозначенных синтаксисом или иным образом заданным позже (для операторов вызова функции (), &&, ||,?: И операторов запятой). Порядок вычисления подвыражений ипорядок, в котором происходят побочные эффекты, является неопределенным "

Для оператора *, если мы возьмем пример с операндами побочного эффекта, такими как:

c =  f() * g();

реализация может вызвать f() first или g() first:

a = f();
b = g();
c = a * b;

или

a = g();
b = f();
c = a * b;

Оба являются допустимыми переводами.

...