void calculate(){
int x=3, y=3, z=1;
printf("%d\n",z+=x<y ? 10:20 );
}
以上代码输出21。
我理解程序首先评估 x < y => 0,然后 z = z + 0 = 1,难道程序不应该打印10吗?因为1是true的另一种形式。
程序显然选择了第二个选项,并将其增加到21,请问有人能解释一下吗?
void calculate(){
int x=3, y=3, z=1;
printf("%d\n",z+=x<y ? 10:20 );
}
以上代码输出21。
我理解程序首先评估 x < y => 0,然后 z = z + 0 = 1,难道程序不应该打印10吗?因为1是true的另一种形式。
程序显然选择了第二个选项,并将其增加到21,请问有人能解释一下吗?
条件运算符的优先级高于赋值运算符。
z+=x<y ? 10:20
被解析为
z+= (x<y ? 10:20)
您可以在这里获取C运算符优先级的摘要:
http://www.kernel.org/doc/man-pages/online/pages/man7/operator.7.html
首先它评估 x 是否小于 y。由于 x = 3,y = 3,因此这是假的,所以它评估为 20。
由于 z 已经等于 1,你加上了 20:
z += 20
z = z + 20
z = 1 + 20
x<y?y:x=20
实际上等价于(x<y?y:x)=20
(这是无效的C代码),而不是你所说的x<y?y:(x=20)
。 - ouah