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。