订购的C表达式评价
答
由于乘法运算符不是序列点,因此没有指定的顺序。序列点包括逗号运算符,完整表达式的结尾和函数调用。因此,(a)
和(b)
的评估顺序取决于编译器的实现。因此,您不应该尝试执行(a)
中的某些操作,该操作会产生您想要在(b)
中看到的副作用,以便生成有效结果。
例如:
int a=5;
int b = (a++) * (a++); //<== Don't do this!!
如果你想要的顺序点对C全上市,你可以检查出一个more thorough reference here。
答
在C90中未指定*
二元运算符的操作数的求值顺序。
下面是从C90标准的有关段落(如询问C90的问题):
(C90,6.3)“除了通过语法或指示不然以后规定(用于函数调用运算符(),& &,||,?,顿号,运营商)的子表达式的计算顺序和顺序副作用的发生都是unspecitied”
对于*
运营商,如果我们以副作用操作数为例:
c = f() * g();
实现可以调用f()
第一或g()
第一:
a = f();
b = g();
c = a * b;
或
a = g();
b = f();
c = a * b;
都是有效的翻译。
[Nothing](http://en.wikipedia.org/wiki/Unspecified_behavior):) :) :) :) – dasblinkenlight 2012-02-24 20:39:30
家庭作业题目需要作业标签。 – 2012-02-24 20:41:28
@Robert:我认为没有人会在作业中提出这样的问题...... – Bruce 2012-02-24 20:42:01