Signed/unsigned 不匹配

Signed/unsigned mismatch

我很难理解我在代码中遇到的问题的性质。 第

if ((struct.c == 0x02) && (struct2.c == 0x02) && (struct.s == !struct2.s))
    {/**/}

其中 cint 并且 suint64_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 作为结构名称只是为了说明目的,否则,structC 中的保留关键字,你不能将其用作变量名称。


注 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 istrueif the converted operand isfalseand 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 行。