C6290
更新:2007 年 11 月
警告 C6290:对逻辑结果的位运算: ! 的优先级高于 &。应改用 && 或 (!(x & y))
此警告指出可能在使用运算符或运算符优先级时产生混淆。
! 运算符生成布尔型结果,它的优先级高于 &。按位与 (&) 运算符采用两个算术参数。因此,检测到下列错误之一:
表达式的括号使用有误:
因为 ! 的结果是布尔值(0 或 1),所以,当本来要测试两个变量是否具有相同的位时,实际却是测试最低位是否出现在右侧:((!8) & 1) == 0。
! 运算符有误,应改用 ~:
! 运算符的结果为布尔值,而 ~ 运算符的结果为算术值。这两个运算符决不能互换,即使在对布尔值(0 或 1)进行运算时也是如此:((!0x01) & 0x10) == 0x0,而 ((~0x01) & 0x10) == 0x10。
二进制运算符 & 有误,应改用 &&:
尽管 & 有时可以与 && 互换,但是它们并不等效,因为前者强制对表达式的右侧进行计算。这种类型的表达式中的某些副作用可能是致命的。
不检查代码,就很难判断此问题的严重性。应当检查代码,以确保进行预期的测试。
示例
下面的代码生成此警告:
void f(int x, int y)
{
if (!x & y)
{
// code ..
}
}
若要更正此警告,请使用下面的代码示例:
void f(int x, int y)
{
/* When testing that x has no bits in common with y. */
if (!(x & y))
{
// code
}
/* When testing for the complement of x in y. */
if ((~x) & y)
{
// code ...
}
}
#include <windows.h>
void fC(int x, BOOL y )
{
/* When y is a Boolean or Boolean result. */
if ((!x) && y)
{
// code ...
}
}
如果 ! 运算符位于 & 运算符的右侧,则会报告 C6317 警告。