2012-02-24 50 views
5

如果我有以下表现:订购的C表达式评价

c = (a) * (b) 

什么是C90的标准说的子表达式“A”和“B”的顺序评价?

+8

[Nothing](http://en.wikipedia.org/wiki/Unspecified_behavior):) :) :) :) – dasblinkenlight 2012-02-24 20:39:30

+0

家庭作业题目需要作业标签。 – 2012-02-24 20:41:28

+2

@Robert:我认为没有人会在作业中提出这样的问题...... – Bruce 2012-02-24 20:42:01

回答

11

由于乘法运算符不是序列点,因此没有指定的顺序。序列点包括逗号运算符,完整表达式的结尾和函数调用。因此,(a)(b)的评估顺序取决于编译器的实现。因此,您不应该尝试执行(a)中的某些操作,该操作会产生您想要在(b)中看到的副作用,以便生成有效结果。

例如:

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

如果你想要的顺序点对C全上市,你可以检查出一个more thorough reference here

+0

或者,甚至更好,SO搜索。 – smparkes 2012-02-24 20:43:44

+2

@Bruce:参见ANSI C草案http://flash-gordon.me.uk/ansi.c.txt,附录A.2 – Christoph 2012-02-24 20:45:53

+0

您的示例确实显示了错误的代码,但不是由于评估顺序。显然,首先评估“a ++”是不重要的。 – ugoren 2012-02-24 22:00:19

3

在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; 

都是有效的翻译。