为什么 '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";
没有执行并且你什么也得不到是正常的。
您的代码符合 int
和 bool
之间的转换规则。
int
个对象之间的比较 return 个 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
其中 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
)。
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";
没有执行并且你什么也得不到是正常的。
您的代码符合 int
和 bool
之间的转换规则。
int
个对象之间的比较 return 个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
其中 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
)。