在C语言中的棘手三目运算符

3
 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,请问有人能解释一下吗?

2个回答

12

条件运算符的优先级不高于赋值运算符。这就是为什么 int x=3,y=5;x<y?y:x=20; 不等于 int x=3,y=5;(x<y?y:x)=20; 而等于 int x=3,y=5;x<y?y:(x=20); - kotlomoy
2
@kotlomoy 首先,你不理解“虚假信息”一词的含义,其次你也不理解自己引用的内容。你有没有仔细阅读ouah的引用、语言标准或其他关于C优先级的来源?所有这些都证实条件运算符比赋值运算符具有更高的优先级。 - Jim Balter
@Jim Batler请阅读链接。我举一个例子: “赋值在表格中与条件具有相同的优先级,结合性是从右到左的,这导致赋值在条件之前正确执行。” - kotlomoy
2
请注意,kotlomoy的链接是一个C++问题,但这是一个C问题。值得注意的是,在C中不能有三元lvalue表达式。 - Jim Balter
@kotlomoy,C和C++的语法规则是不同的。在C中,你的例子x<y?y:x=20实际上等价于(x<y?y:x)=20(这是无效的C代码),而不是你所说的x<y?y:(x=20) - ouah
显示剩余8条评论

3

首先它评估 x 是否小于 y。由于 x = 3,y = 3,因此这是假的,所以它评估为 20。

由于 z 已经等于 1,你加上了 20:

z += 20

z = z + 20

z = 1 + 20


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接