令人困惑的C条件运算符的结果

时间:2013-07-25 17:05:01

标签: c++ c ternary-operator conditional-operator

int a=1,b=2,c=3;
int x=1;
int y=10;
a = x ? b : c;  
cout<< a;      // Outputs 2 (the value of b)
a = y ? b : c; 
cout<< a;      // Outputs 2 (the value of b)

现在,请看以下内容。

a=0;
x=0;
a = x ? b : c;
cout<< a;  //   Outputs 3 (the value of c !!!!) 

为什么这种不寻常的行为?只有当a和x都为0时,表达式的计算结果为 false ,否则,总是 true 。请解释一下。

5 个答案:

答案 0 :(得分:6)

因为x为0。

回想一下,如果condition ? a : b为真,则三位运算符a返回condition,否则返回b。您将它与数字一起使用,除0之外的任何数字都被视为true作为布尔值。

您的案例中的{p> x ? b : c0 ? 2 : 3,而且0false,则评估为3.然后将3分配给您的a变量并打印 - 没有什么不寻常的事情发生在这里。

答案 1 :(得分:4)

这看起来非常好。表达式a = x ? b : c等同于

if (x)
    a = b;
else
    a = c;
对于任何非零值, x将评估为true,因此如果在执行表达式之前将0分配给x,则c的值将分配给a,如果在执行表达式之前将1分配给x,则b的值将被分配给a。 a的先前值在这里是无关紧要的。

答案 2 :(得分:0)

原因是在C和C ++中任何非零值都被评估为“true”。

答案 3 :(得分:0)

'a'的值仅取决于'x'和'y'的值。由于最初'x'和'y'都大于0,因此条件的计算结果为true,并且在'a'中得到'b'的值。 在第二种情况下,'x'为零,将条件评估为false,导致'a'的值为'c'。

答案 4 :(得分:0)

a = x ? b : c;

相同
if(x != 0) {
    a = b;
} else {
    a = c;
}

因此,如果设置x = 0,您将获得a = c。