C++ 如果(x==y==z)起作用,如果(x!=y!=z)不起作用
原因是: 处理方式如下:C++ 如果(x==y==z)起作用,如果(x!=y!=z)不起作用,c++,c,C++,C,原因是: 处理方式如下: if(x!=y!=z) ? 我今天才注意到它。它可能被解析为if((x!=y)!=z)它不做你认为的if(x!=y!=z)应该做的事(但不做) 同样地,if(x==y==z)对编译器来说可能意味着if((x==y==z),这不是您想要的 启用编译器给出的警告。对于GCC,这意味着GCC-Wall,它会告诉您警告:建议在“==”操作数中的比较周围加括号 回想一下,像x==y这样的布尔表达式给出了零(如果为false)或非零(如果为true)结果。编写((x==y)+(z
if(x!=y!=z)
?
我今天才注意到它。它可能被解析为
if((x!=y)!=z)
它不做你认为的if(x!=y!=z)
应该做的事(但不做)
同样地,if(x==y==z)
对编译器来说可能意味着if((x==y==z)
,这不是您想要的
启用编译器给出的警告。对于GCC,这意味着GCC-Wall
,它会告诉您警告:建议在“==”操作数中的比较周围加括号
回想一下,像x==y
这样的布尔表达式给出了零(如果为false)或非零(如果为true)结果。编写((x==y)+(z==t))
的味道很差,但对编译器来说是有意义的。x!=y
和x==y
返回布尔值。
你把z
和那些布尔人做比较
它们都不会按您希望的方式工作。x==y==z
相当于(x==y)==z
。在这种情况下,(1==1)==2
,或true==2
,这是false
,因为true==1
,而不是2
x!=y!=z
相当于(x!=y)!=z
。在这种情况下,(1!=1)!=2
或错误!=2
,它是真的
,因为假==0
,而不是2
C(++)关系运算符不像Python中那样被链接。如果要检查三个数字是否都相等,请使用(x==y)&&(y==z)
直到u将用于z的值为1或0时才起作用,但u可以取x和y的任何值
当您尝试使用值1或0时,if将其参数作为
if(x==y==z)
这是因为它首先计算x和y中的任何值,答案将是布尔值,然后用z检查期望的布尔值。所以,如果(x==y)be,z是1(true),那么代码将被执行,否则它不会执行。同样的事情也会发生在(x!=y!=z)上。试着用z=1或0和x,y做任何事。对不起,我不明白你要什么。你能检查一下你是否已经添加了理解你的问题所需的每一个细节吗。你想象的也不一样。一本关于基本C语言的好书(“操作符”部分)会有所帮助。我很确定true==!0
,所以1和2都是真的。dan04是正确的(1==1)
的类型为bool
,值为true
。虽然bool
和int
都是整数类型,但它们不是同一类型。根据提升规则,bool
值需要提升为int
,以便与2进行比较。在该转换中,bool
值true
被转换为1,1==2
为false。@TMN!0
不会同时计算1
和2
。自从<代码>
是一个布尔运算符,0
隐式转换为false
,因此!0
变为true
,如果尝试将其与整数进行比较,则会隐式转换为1
。这是不正确的<代码>=和=代码>从左到右绑定<在这两个例子中,code>x
都与y
相比较。@CharlesBailey:我不确定;固定的。谢谢你为什么说“可能”?我想不出一个不确定的例子。我可能说,因为没有手头的标准,我不完全确定它不是解析为<代码>(x=(y!= z))< /> >这是非常违反直觉的(甚至对我来说)。最后一行对C是正确的,但对于C++来说是不正确的(布尔表达式被评估为<代码> false < /代码>)。
if(x==y==z)
if((x==y)==z)