C6291
警告 C6291: 論理演算結果に対してビットごとの演算を行っています: | よりも ! が優先されます。代わりに || または (!(x | y)) を使用します。
! 演算子はブール型の結果が得られる演算子であり、| (ビットごとの OR) 演算子は 2 つの数値型引数を受け取ります。また、! 演算子は|.
そのため、次のいずれかのエラーが検出されました。
式のかっこの付け方が正しくありません。
! の結果はブール型 (0 または 1) であるため、2 つの変数にビットが設定されているかどうかテストすると、最下位ビットが右側にあるかどうかをテストするだけになります。たとえば x == 0 と y == 1 のときに、((!x) | y) != (!(x | y)) とした場合です。
! 演算子が適切ではありません。代わりに ~ を使用する必要があります。
! 演算子ではブール型の結果が得られますが、~ 演算子では演算結果が得られます。ブール型の値 (0 または 1) を操作する場合でも、この 2 つの演算子には互換性がありません。たとえば 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
}
}