Порядок вычисления выражения в C

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

c = (a) * (b)

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

2 ответа

Решение

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

Например:

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

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

Порядок оценки операндов * бинарный оператор не указан в C90.

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

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

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

c =  f() * g();

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

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

или же

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

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

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