【问题标题】:Confusing outcome of C conditional operator [closed]C条件运算符的令人困惑的结果[关闭]
【发布时间】:2013-07-25 17:17:49
【问题描述】:
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。请解释一下。

【问题讨论】:

  • 嗯...实际上这种行为很常见。如果您的结论是 both ax 必须是 0 以使 a 获得 c 的值,那么您没有正确阅读实验结果跨度>
  • 是的。我现在明白了。我总结错了。谢谢!

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


【解决方案1】:

因为x 是0。

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

在您的情况下x ? b : c0 ? 2 : 3,并且由于0false,它的计算结果为3。然后将3 分配给您的a 变量并打印-这里没有什么异常情况。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 关于将0 分配给x 如何将b 分配给a
    • @hhacks,我更新了答案以使措辞更加清晰。当然,如果你给 x 赋值,a 什么也不会发生;我的意思是,如果执行语句时 x 的值为 0,则 a 将获得 b 的值,否则 a 将获得 c 的值。
    • @KristianDuske;如果在执行语句时x 的值是0,那么a 将得到c 的值而不是b!因为0 代表假。
    • @hacks 当然,谢谢!
    • @KristianDuske;欢迎您。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        a = x ? b : c;
        

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-30
          • 2011-02-01
          • 1970-01-01
          相关资源
          最近更新 更多