如果我有以下表达式:
c = (a) * (b)
C90标准对子表达式'a'和'b'的顺序评估有什么看法?
答案 0 :(得分:11)
由于乘法运算符不是序列点,因此没有指定的顺序。序列点包括逗号运算符,完整表达式的结束和函数调用。因此,(a)
和(b)
的评估顺序取决于编译器实现。因此,您不应尝试在(a)
中执行某些操作,这些操作会产生您希望在(b)
中看到的副作用,以便生成有效结果。
例如:
int a=5;
int b = (a++) * (a++); //<== Don't do this!!
如果您想要C的序列点的完整列表,可以查看more thorough reference here。
答案 1 :(得分:3)
{C}中未指定*
二元运算符的操作数的评估顺序。
以下是C90标准的相关段落(关于C90的问题):
(C90,6.3)“除非语法指示或稍后指定(对于函数调用运算符(),&amp;&amp;,||,?:和逗号运算符)。评估顺序子表达式和副作用发生的顺序都是未指明的“
对于*
运算符,如果我们采用副作用操作数的示例,如:
c = f() * g();
该实施可以先调用f()
或先调用g()
:
a = f();
b = g();
c = a * b;
或
a = g();
b = f();
c = a * b;
两者都是有效的翻译。