-7
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。请解释。

4

5 回答 5

6

因为x是0。

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

x ? b : c在您的情况下 is 0 ? 2 : 3,并且因为0is false,它的计算结果为 3。然后将 3 分配给您的a变量并打印 - 这里没有什么不寻常的事情发生。

于 2013-07-25T17:10:12.623 回答
4

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

if (x)
    a = b;
else
    a = c;

x 对于任何非零值都会计算为真,因此如果在执行表达式之前将 0 分配给 x,则 c 的值将分配给 a,如果在执行表达式之前将 1 分配给 x,则 b 的值将分配给a。a 的先验值在这里无关紧要。

于 2013-07-25T17:08:07.033 回答
0
a = x ? b : c;

是相同的

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

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

于 2013-07-25T19:05:11.650 回答
0

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

于 2013-07-25T17:08:19.197 回答
0

'a' 的值仅取决于 'x' 和 'y' 的值。由于最初 'x' 和 'y' 都大于 0,因此条件评估为真,并且您在 'a' 中得到 'b' 的值。在第二种情况下,“x”为零,这会将条件评估为 false,从而导致“a”具有“c”的值。

于 2013-07-25T17:12:39.940 回答