我很难理解我在代码中遇到的问题的性质。 行
if ((struct.c == 0x02) && (struct2.c == 0x02) && (struct.s == !struct2.s))
{/**/}
其中c
为int
且s
为uint64_t
生成
C4388:'=='签名/未签名不匹配
警告。我明白那个警告是什么,我看不到这里触发的是什么。我错过了什么?
答案 0 :(得分:12)
直接引用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)
,但这也只是一个(可能的)猜测。
FOOTNOTE ::早期的问题也标记为C ++,将其作为脚注移动,但保留信息仅供参考。
关于C++
,!
的返回类型为bool
。参考:C++11
,章节§5.3.3(再次强调我的)
逻辑否定运算符
!
的操作数在上下文中转换为bool(Clause 4); its value is
trueif the converted operand is
falseand false
。 结果的类型为bool
。
答案 1 :(得分:1)
[评论太久了]
为了充分利用编译器警告,请始终尝试在一行中只放置一个语句/表达式(至少在尝试确定错误/警告的来源时是暂时的)。
所以,如果您已经以这种方式设置代码:
if (
(struct.c == 0x02)
&& (struct2.c == 0x02)
&& (struct.s == !struct2.s)
)
编译器完全指出(相对地)第4行。