【问题标题】:Why is 'if(1 == 1 == 1 == 1 == 1);' TRUE but 'if(-1 == -1 == -1 == -1 == -1);' FALSE? [duplicate]为什么'if(1 == 1 == 1 == 1 == 1);'是的,但 'if(-1 == -1 == -1 == -1 == -1);'错误的? [复制]
【发布时间】:2020-06-26 18:21:54
【问题描述】:
if (1 == 1 == 1 == 1 == 1)
    std::cout << "right";

上面的代码显示“正确”。

if (-1 == -1)
    std::cout << "right";

上面的代码也显示“正确”。

if (-1 == -1 == -1)
    std::cout << "right";

上面的代码什么也没显示。 (我猜这是因为if statement 不正确?)

我想知道为什么会发生这种奇怪的事情。

因为-1 等于-1,而且无论我重复多少次(据我所知),这句话总是正确的。

【问题讨论】:

  • 想想true == negative-one 的评估结果是什么
  • @M.M,同样的问题,但你只是不要从 -1 开始。无论如何,-1 == -1truetrue11 == -1false
  • 请记住,在 C++ 中,您编写的不是数学方程式,而是一系列逐一计算的语句。
  • @M.M aha,现在我明白了。谢谢!
  • 我刚刚对所有的 cmets 投了赞成票!谢谢大家!

标签: c++ if-statement short-circuiting


【解决方案1】:

条件是从左到右计算的,因此下面的条件语句

if (-1 == -1 == -1)
    std::cout << "right";

等价于

if (true == -1)//since -1 === -1
    std::cout << "right";

相当于

if (1 == -1) // true is casted to 1
    std::cout << "right";

相当于

if (false)
    std::cout << "right";

因此,std::cout &lt;&lt; "right"; 语句不执行并且您什么也得不到是正常的。

【讨论】:

    【解决方案2】:

    您的代码符合intbool 之间的转换规则。

    1. int 对象之间的比较返回 bool
    2. boolint 之间的比较将bool 向上转换为int
      • false 转换为 int0
      • true 转换为 int 通常是 1

    您的代码执行 (1) 第一次比较和 (2) 之后的所有比较。

    所以,如果我们写下您的条件并逐步评估它:

    (1 == 1)   // == ... == 1
    (true)     // == ... == 1
    int(true)  // == ... == 1
    1          // == ... == 1
    true
    

    如果你比较 -1:

    (-1 == -1)   // == ... == -1
    (true)       // == ... == -1
    int(true)    // == ... == -1
    1            // == ... == -1
    false
    

    【讨论】:

      【解决方案3】:

      让我们看看你的三个例子。

      1 == 1 == 1 == 1 == 1 将等价于true == 1 == 1 == 1,因为true == 1true(因为true 被视为1),然后你会得到true == 1 == 1,然后是true == 1最后只是true

      在您的第二个示例中,-1 == -1,这只是true,因为显然-1 等于它自己。

      现在,对于您的最后一个示例,您有 -1 == -1 == -1,它变为 true == -1true 不等于 -1,因为 1 不等于 -1,所以这是错误的。因此,"right" 不会被打印出来。

      【讨论】:

        【解决方案4】:

        在 C++ 中,相等运算符== 的求值顺序是从左到右:

        (-1 == -1) == -1 
        

        被评估为

        1 == -1 
        

        返回假

        【讨论】:

          【解决方案5】:

          条件按顺序完成,所以:

          -1 == -1 == -1 == -1 == -1
          

          变成

          true == -1 == -1 == -1 (because the first -1==-1 gives true)
          

          变成

          false == -1 == -1 (because true==-1 gives false)
          

          变成

          false ==-1
          

          变成

          false
          

          1==1==1==1==1 也会发生同样的事情,因为1==true(但不是1===true)。

          【讨论】:

            猜你喜欢
            • 2016-08-31
            • 2016-04-22
            • 2018-08-21
            • 2018-09-08
            • 1970-01-01
            • 1970-01-01
            • 2018-09-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多