为什么 'if(1 == 1 == 1 == 1 == 1);' 为真而 'if(-1 == -1 == -1 == -1 == -1);' 为假?

Why is 'if(1 == 1 == 1 == 1 == 1);' TRUE but 'if(-1 == -1 == -1 == -1 == -1);' FALSE?

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

上面的代码显示'right'。

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

上面的代码也显示了'right'。

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

上面的代码没有显示任何内容。 (我猜是因为 if statement 不是真的?)

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

因为 -1 等于 -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 << "right"; 没有执行并且你什么也得不到是正常的。

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

  1. int 个对象之间的比较 return 个 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

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

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" 不会被打印出来。

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

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

被评估为

1 == -1 

其中 returns 错误

条件按顺序完成:

-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)。