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)
  )