如果(x == y == z)有效,if(x!= y!= z)则不然

时间:2011-11-27 17:58:01

标签: c++ c

为什么:

if(x!=y!=z)

处理为:

x=1
y=1
z=2

...

我今天才注意到它。

4 个答案:

答案 0 :(得分:19)

x != yx == y返回布尔值 您将z与那些布尔值进行比较。

他们都不会按照你想要的方式工作。

答案 1 :(得分:10)

它可能被解析为if ((x!=y) !=z),它不会按照您的想法if (x!=y!=z)执行(但不会)。

同样if (x==y==z)可能对编译器意味着if ((x==y)==z),这不是你想要的。

启用编译器提供的警告。使用GCC,这意味着gcc -Wall,它会告诉您warning: suggest parentheses around comparison in operand of '=='

回想一下,像x==y这样的布尔表达式给出零(当为假)或非零(在为真时)结果。写((x==y) + (z==t))的味道很差,但对编译器来说很有意义。

答案 2 :(得分:3)

x == y == z相当于(x == y) == z。在这种情况下,(1 == 1) == 2true == 2false,因为true == 1,而不是x != y != z

(x != y) != z相当于(1 != 1) != 2。在这种情况下,false != 2truefalse == 0,因为(x == y) && (y == z),而不是{{1}}。

C(++)关系运算符不像Python那样被链接。如果要检查三个数字是否彼此相等,请使用{{1}}。

答案 3 :(得分:0)

if(x==y==z) 

将无法工作,直到z将用于1或0的值,但你可以取x和y的值 当您尝试使用值1或0时,if将其参数设为

 if((x==y)==z)

这种情况正在发生,因为它首先评估x和y中的任何值,答案将在布尔值中,然后用z检查它预期是否为布尔值。所以如果(x == y)是和z是1(真)那么代码将被执行,否则它将不会。(x!= y!= z)将发生事情。尝试使用z = 1或0和x,y可以是任何东西。