这个表达式怎么分析呢?首先,<的优先级高于三目运算符,因此表达式变为(a < b) ? a : (c < d) ? a : d。现在,表达式中有两个三目运算符,处于中间的(c<d)和哪个三目运算符结合?由于三目运算符是右结合(从右向左),因此(c<d)与右边的三目运算符结合,表达式变为(a < b) ? a : ( (c < d) ? a : d)。到此,没有再需要判断顺序和结合性的情况了,编译器可以开始求值了。
既然有一般就有特殊。C语言对4个运算符规定了表达式的求值顺序:
a && b :先求a,只有a为真才会求b的值
a || b :只有a为假才会求b的值
a, b, c : 逗号运算符,从左到右依次求a、b、c的值。要特别注意的是,函数的参数列表中分隔多个参数的逗号不属于逗号运算符。也就是说,如果你这样调用函数:foo(a++, a),到底先算a++,还是先算a,这个顺序也没有保证。
a ? b : c 三目运算符,只有a为真才会求b的值,只有a为假才会求c的值