优先功能和评估顺序K& R.

时间:2015-01-02 23:36:41

标签: c function operator-precedence

我从 K& R 这本书中读到了一个优先案例:

  

x = f() + g();

     

f可以在g之前评估,反之亦然

我所知道的是,旁注()的评估顺序高于+,之后是=。除()之外,评估顺序将从从左到右。所以,如果我说得对,为什么他说可能会被评估,好像它是不确定

这个问题有点愚蠢但对我来说非常重要,要清除不清楚的内容。

2 个答案:

答案 0 :(得分:4)

它们意味着在将+运算符应用于这些结果之前,是否要首先在右侧评估+的左侧,或者反之亦然,这取决于C编译器实现。如果f()g()执行所谓的副作用,这一点很重要。如果f()修改了某个全局变量,并且g()修改了相同的全局变量,那么如果C编译器从右向左计算,则由f()执行的修改将占优势,而修改由如果编译器从左到右进行评估,则g()将占上风。

答案 1 :(得分:0)

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

f() + g() + h()

然后编译器可以自由地生成类似的东西:

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

对于像许多程序员失败的i++ + ++i这样的表达式来说,这是同样的问题。