C 有符号/无符号不匹配
我很难理解我在代码中遇到的问题的本质。 线 其中C 有符号/无符号不匹配,c,compiler-warnings,C,Compiler Warnings,我很难理解我在代码中遇到的问题的本质。 线 其中c为int而s为uint64 C4388:“==”有符号/无符号不匹配 警告。我明白那个警告是什么,我看不出是什么触发了它。我遗漏了什么?直接引用C11标准,第§6.5.3.3章,(强调我的) 逻辑求反运算符的结果为0 不等于0,1如果其操作数的值比较等于0结果的类型为int 因此,逻辑的结果运算符是int,所以!struct2.s生成int值和表达式 ....(struct.s == !struct2.s) 制造问题 注1: 我猜您使用str
c
为int
而s
为uint64
C4388:“==”有符号/无符号不匹配
警告。我明白那个警告是什么,我看不出是什么触发了它。我遗漏了什么?直接引用C11
标准,第§6.5.3.3章,(强调我的)
逻辑求反运算符的结果如果比较其操作数的值,则代码>为0
不等于0
,1
如果其操作数的值比较等于0
结果的类型为int
因此,逻辑的结果代码>运算符是int
,所以!struct2.s
生成int
值和表达式
....(struct.s == !struct2.s)
制造问题
注1:
我猜您使用struct
作为结构名称只是为了说明,否则,struct
作为C
中的保留关键字,您不能将其用作变量名称
注2:
也许你真正的意思是(struct.s!=struct2.s)
,但这也只是一个(可能的)猜测
脚注:前面的问题也用C++来标记,把它作为脚注移动,但保持信息仅供参考。
关于
C++
,返回类型为代码>是bool
。参考:C++11
,第§5.3.3章(再次强调)
逻辑求反运算符的操作数代码>上下文转换为bool(第4条);如果转换的操作数为
false,则其值为
true,否则为false结果类型为bool
[评论太长]
要最大限度地利用编译器警告,请始终尝试在一行中仅放置一个语句/表达式(至少在尝试确定错误/警告的来源时暂时放置)
因此,如果您这样设置代码:
if (
(struct.c == 0x02)
&& (struct2.c == 0x02)
&& (struct.s == !struct2.s)
)
编译器正好将您指向(相对而言)第4行。struct
是C中的保留关键字。我不建议将其用作变量名。这只是为了说明目的,这是一个C代码,对吗?是的,它恰好是“数值转换”。我认为这将导致目的地类型uint64\u t
,使问题仅为C。那么为什么要添加C++标记呢?@JensGustedt只是添加了这个标记,不过作为一个注释。谢谢。:-)很有魅力,谢谢你。至于操作的意图,struct.s==!结构2S/<代码>正是我要做的,但是感谢关心:C++的否定也产生了<代码> int /代码>吗?或者那是bool
那里吗?@Sven不客气。:-)顺便说一下,你可以考虑一个帮助你的答案。
if (
(struct.c == 0x02)
&& (struct2.c == 0x02)
&& (struct.s == !struct2.s)
)