Порядок вычисления выражения в 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;
Оба являются действительными переводами.