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。
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
成为
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
)。
您的代码符合int
和bool
之间的转换规则。
int
对象之间的比较返回bool
。bool
和int
之间的比较将bool
上载到int
。false
强制转换为int
是0
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 == 1
为true
(因为true
被当作1
对待),所以您将得到true == 1 == 1
,然后是true == 1
和最后只是true
。
在您的第二个示例-1 == -1
中,这只是true
,因为显然-1
等于自己。
现在,对于您的最后一个示例,您有-1 == -1 == -1
,它变为true == -1
。 true
不等于-1
,因为1
不等于-1
,因此这是错误的。结果,不会打印"right"
。
在C ++中,相等运算符==
的求值顺序是从左到右:
(-1 == -1) == -1
被评估为
1 == -1
返回false