2015-01-02 111 views
1

的顺序我从书ķ&ř一个优先的实例为:优先功能和评估K&R

x = f() + g();

f可以克之前或进行评估反之亦然

我所知道的是,paraentheses的评价()我的订单比+高,之后是=。除了()评估的顺序将从从左至右。所以,如果我是正确的,他为什么说可以被评估,就好像它是并不一定

这个问题有点愚蠢,但对我来说很清楚不清楚。

+1

有F的'没有序列点()'和'克()',它喜欢这样编译器可以做什么。作为一般规则,C中的表达式不是从左到右评估的。 – sapi

+2

也参见[在C99,是'F()+ G()'未定义或仅非特定?](http://stackoverflow.com/questions/3951017/in-c99-is-fg-undefined-or-merely-未指定的/ 3951189#3951189) –

+2

对于二元运算符,在优先级的表中的“从左到右”注释意味着'A - b - C'具有被解释为'(一 - b) - C',而不是作为'a - (b - c)'。这也意味着'a + b - c'被解释为'(a + b) - c'而不是'a +(b - c)'。然而,这并不能阻止在'a'或'b'之前评估'c';操作数的评估顺序仍然取决于编译器。 –

回答

4

这意味着它是由C编译器实现的,是否先在右侧评估+的左侧,反之亦然,然后再将+运算符应用于这些结果。如果f()g()执行所谓的副作用,这一点很重要。如果f()修改某些全局变量,并g()修改同一个全局变量,通过f()进行的修改将如果C编译器计算为准从右到左,而如果编译器计算从左向右g()进行修改为准。

+2

值得注意的是,编译器不必每次遇到同样的表达方式;它可能会根据周围环境选择不同的代码。同一个编译器的新运行,或编译器的新版本,或不同的编译器 - 所有这些都可能会给出不同的结果。虽然大多数编译器实际上都是确定性的,但他们没有义务遵循“似乎”规则。 –

0

令人困惑的是标准说+是从左到右的关联,但这并不意味着总和的每个子表达式都是从左到右进行评估!未指定子表达式的评估顺序。因此,如果您有:

f() + g() + h() 

那么编译器就可以产生类似:

t1 = h() 
t2 = f() 
t3 = g() 
(t2+t3)+t1 

这对于像i++ + ++i表达式很多程序员不能对同样的问题。