为什么是'if(1 == 1 == 1 == 1 == 1);'正确,但'if(-1 == -1 == -1 == -1 == -1);'假? [重复]

问题描述 投票:2回答:5
if (1 == 1 == 1 == 1 == 1)
    std::cout << "right";

上面的代码显示为'正确'。

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

上面的代码也显示'正确'。

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

上面的代码什么也没显示。 (这是因为我猜'if语句'不是TRUE?)

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

因为'-1'等于'-1',并且无论我重复多少次(据我所知),该语句始终为TRUE。

c++
5个回答
7
投票
if (-1 == -1 == -1)
    std::cout << "right";

相当于

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

相当于

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

相当于

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

所以std::cout << "right";不执行是正常的。


1
投票

条件按其顺序完成:

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


0
投票

您的代码符合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

0
投票

让我们看看您的三个示例。

[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"


0
投票

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

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

被评估为

1 == -1 

返回false

© www.soinside.com 2019 - 2024. All rights reserved.