2013-05-18 105 views
3
void calculate(){ 

    int x=3, y=3, z=1; 

    printf("%d\n",z+=x<y ? 10:20); 

} 

上述代码打印21.棘手三元操作用C

我明白首先,程序将评估X < Y => 0,则z = Z + 0 = 1,不应该将程序打印10因为1是另一种形式的真实。

该程序明确地选择了第二个选项,它也增加到21,请问有人能解释一下吗?

回答

12

条件运算符的优先级高于赋值运算符。

z+=x<y ? 10:20

被评估为

z+= (x<y ? 10:20)

你可以得到C运算符优先这里的摘要:

http://www.kernel.org/doc/man-pages/online/pages/man7/operator.7.html

+0

-1为假情报(我不能downvote虽然)。条件运算符的优先级不会高于赋值。这就是为什么int x = 3,y = 5; x kotlomoy

+0

http://stackoverflow.com/questions/7499400/c-ternary-conditional-and-assignment-operator-precedence – kotlomoy

+2

@kotlomoy首先,你不明白“造假”这个词的意思,其次你不明白你自己的引用。你是否甚至懒得读取ouah的引用,或语言标准,或C优先级的任何其他来源,所有这些都证实了条件运算符比赋值具有更高的优先级? –

3

首先,它的计算结果X小于y。由于x = 3和y = 3,这是假的,所以它的计算结果为20

,由于Z已经= 1,您添加20到它:

z += 20

z = z + 20

z = 1 + 20