响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:evaluation_order

求值顺序(Evaluation order)

C语言中,某些运算的顺序是确定的,而其他运算的顺序则不确定。

例如表达式:

        f(a) < f(b) && f(c) > f(d)

这里f(a) < f(b)会先计算,根据比较结果才决定是否执行f(c) > f(d)(参见:逻辑与/或操作符的注意事项)。但在f(a) < f(b)这个子表达式中,编译器可能先计算f(a),也可能先计算f(b),或者两者同时并行求值(某些机器上),此时求值顺序是不确定的。

具体的说,只有如下四个操作符规定了求值顺序:

  1. 逻辑与&&;
  2. 逻辑或||;
  3. ?:三元条件表达式;
  4. ,逗号表达式。

需要注意的是,包含逗号的函数参数列表并不是逗号表达式(此时的逗号是分隔符),参数之间的求值顺序是不确定的。如函数f(a, b),先计算a还是b是不确定的。

在实际编程过程中,对没有明确规定求值顺序的操作要特别注意,不能主观假设某种求值顺序。

computer/c/tips/evaluation_order.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1