为什么:
if(x!=y!=z)
处理为:
x=1
y=1
z=2
...
我今天才注意到它。
答案 0 :(得分:19)
x != y
和x == 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) == 2
或true == 2
,false
,因为true == 1
,而不是x != y != z
。
(x != y) != z
相当于(1 != 1) != 2
。在这种情况下,false != 2
或true
,false == 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可以是任何东西。