Signed/unsigned 不匹配
Signed/unsigned mismatch
我很难理解我在代码中遇到的问题的性质。
第
行
if ((struct.c == 0x02) && (struct2.c == 0x02) && (struct.s == !struct2.s))
{/**/}
其中 c
是 int
并且 s
是 uint64_t
产生
C4388:'==' signed/unsigned mismatch
警告。我明白那个警告是什么,我在这里看不到是什么触发了它。我错过了什么?
直接引用C11
标准,章节§6.5.3.3,(强调我的)
The result of the logical negation operator !
is 0
if the value of its operand compares
unequal to 0
, 1
if the value of its operand compares equal to 0
. The result has type int
....
所以,逻辑运算符!
的结果是int
,所以!struct2.s
产生int
值,表达式
....(struct.s == !struct2.s)
创建问题。
注 1:
我猜你使用 struct
作为结构名称只是为了说明目的,否则,struct
是 C
中的保留关键字,你不能将其用作变量名称。
注 2:
也许您的实际意思是 (struct.s != struct2.s)
,但这也只是一个(可能)猜测。
FOOTNOTE :: 之前的问题也标记为 C++,将其作为脚注移动但保留信息仅供参考。
关于C++
,!
的return类型是bool
。参考:C++11
,第 5.3.3 章(再次强调我的)
The operand of the logical negation operator !
is contextually converted to bool(Clause 4); its value is
trueif the converted operand is
falseand false
otherwise. The type of the result is bool
.
[评论太长]
为了充分利用编译器警告,请始终尝试在一行中只放置一个 statement/expression(至少在尝试确定错误“s/warning”的来源时暂时如此)。
因此,如果您以这种方式设置代码:
if (
(struct.c == 0x02)
&& (struct2.c == 0x02)
&& (struct.s == !struct2.s)
)
编译器已将您准确指向(相对)第 4 行。
我很难理解我在代码中遇到的问题的性质。 第
行if ((struct.c == 0x02) && (struct2.c == 0x02) && (struct.s == !struct2.s))
{/**/}
其中 c
是 int
并且 s
是 uint64_t
产生
C4388:'==' signed/unsigned mismatch
警告。我明白那个警告是什么,我在这里看不到是什么触发了它。我错过了什么?
直接引用C11
标准,章节§6.5.3.3,(强调我的)
The result of the logical negation operator
!
is0
if the value of its operand compares unequal to0
,1
if the value of its operand compares equal to0
. The result has typeint
....
所以,逻辑运算符!
的结果是int
,所以!struct2.s
产生int
值,表达式
....(struct.s == !struct2.s)
创建问题。
注 1:
我猜你使用 struct
作为结构名称只是为了说明目的,否则,struct
是 C
中的保留关键字,你不能将其用作变量名称。
注 2:
也许您的实际意思是 (struct.s != struct2.s)
,但这也只是一个(可能)猜测。
FOOTNOTE :: 之前的问题也标记为 C++,将其作为脚注移动但保留信息仅供参考。
关于C++
,!
的return类型是bool
。参考:C++11
,第 5.3.3 章(再次强调我的)
The operand of the logical negation operator
!
is contextually converted to bool(Clause 4); its value is
trueif the converted operand is
falseand false
otherwise. The type of the result isbool
.
[评论太长]
为了充分利用编译器警告,请始终尝试在一行中只放置一个 statement/expression(至少在尝试确定错误“s/warning”的来源时暂时如此)。
因此,如果您以这种方式设置代码:
if (
(struct.c == 0x02)
&& (struct2.c == 0x02)
&& (struct.s == !struct2.s)
)
编译器已将您准确指向(相对)第 4 行。