我从 K& R 这本书中读到了一个优先案例:
x = f() + g();
f可以在g之前评估,反之亦然
我所知道的是,旁注()
的评估顺序高于+
,之后是=
。除()
之外,评估顺序将从从左到右。所以,如果我说得对,为什么他说可能会被评估,好像它是不确定?
这个问题有点愚蠢但对我来说非常重要,要清除不清楚的内容。
答案 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
这样的表达式来说,这是同样的问题。