Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果(x==y==z)起作用,如果(x!=y!=z)不起作用_C++_C - Fatal编程技术网

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)