共用方式為


C6290

警告 C6290: 邏輯結果的位元運算: ! 的優先順序高於 &。請改用 && 或 (!(x & y))

這項警告表示使用運算子或運算子優先順序可能會產生的混淆。

! 運算子會產生布林結果,而且它的優先順序高於 &。位元 AND (&) 運算子會採用兩個算術引數。因此,會偵測到下列其中一個錯誤:

  • 運算式的括號位置錯誤:

    因為 ! 的結果為布林值 (零或一),所以嘗試對兩個具有共同位元的變數進行測試,只會讓這兩者的最低位元成為測試結果,出現在運算式右邊:((!8) & 1) == 0。

  • ! 運算子不正確,且應改為 ~:

    ! 運算子會有布林結果,而 ~ 運算子會有算術結果。這些運算子絕不可交換,即使在布林值 (零或一) 上運算時也一樣:((!0x01) & 0x10) == 0x0,而 ((~0x01) & 0x10) == 0x10。

  • 二元 (Binary) 運算子 & 不正確,它應該是 &&:

    雖然 & 有時候可以和 && 交換,但這並不是對等用法,因為它會強制評估運算式的右邊。這種運算式的某些副作用可能會被終止。

如果不檢查程式碼,會很難判斷此問題的嚴重性。應該檢查程式碼,以確保會發生所要的測試。

範例

下列程式碼將產生出這個警告:

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。

請參閱

參考

C6317