C6291
警告 C6291:对逻辑结果的位运算: ! 的优先级高于 |。 应改用 || 或 (!(x | y))
! 运算符产生一个布尔值结果,|(按位或)运算符采用两个算术参数。 ! 运算符的优先级也高于 |.
因此,检测到下列错误之一:
表达式的括号使用有误:
因为 ! 的结果是布尔值(0 或 1),所以,当本来要测试两个变量是否具有相同的位时,实际却是测试最低位是否出现在右侧:当 x == 0 且 y == 1 时,((!x) | y) != (!(x | y))。
! 运算符有误,应改用 ~:
! 运算符的结果为布尔值,而 ~ 运算符的结果为算术值。 这两个运算符决不能互换,即使在对布尔值(0 或 1)进行运算时也是如此:当 x == 1 且 y == 0 时,((!x) | y) != ((~x) | y)。
二元运算符| 有错误,应改为 ||:
即使| 有时可以与 || 互换,但是它们并不等效,因为前者强制对表达式的右侧进行计算。 这种类型的表达式中的某些副作用可能是致命的:当 p == NULL 时,(!p | (*p == '\0')),这时切勿使用它,以便对表达式的另一半进行计算。
如果 ! 运算符位于| 运算符的右侧,将不报告此警告,因为这通常只是错误运算符的一种相对无害的情况。
不检查代码,就很难判断此问题的严重性。 应当检查代码,以确保进行预期的测试。
此警告总是指出可能在使用运算符或运算符优先级时产生混淆。
示例
下面的代码生成此警告:
void f(int x, int y )
{
if (!x | y)
{
//code
}
}
若要更正此警告,应使用如下面的代码所示的某个方法:
void fC(int x, int y )
{
/* When checking whether any bits are set in either x or y. */
if (!(x | y))
{
// code
}
/* When checking whether bits are set in either */
/* the complement of x or in y. */
if ((~x) | y)
{
// code
}
}
#include <windows.h>
void f(int x, BOOL y )
{
/* When y is a Boolean or Boolean result. */
if ((!x) || y)
{
// code
}
}