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
  }
}