Share via


警告 C6291

論理結果に対するビットごとの演算: ! は | よりも優先順位が高くなります。 || を使用するまたは (!(x |代わりに y))

! 演算子はブール型の結果を生成し、| (ビットごとの OR) 演算子は 2 つの算術引数を受け取ります。 ! 演算子は、| よりも優先順位が高くなります。

そのため、次のエラーのいずれかが検出されました。

  • 式のかっこが正しくありません。

    ! の結果はブール値 (0 または 1) であるため、2 つの変数にビットが設定されていることをテストしようとすると、右側に最低ビットが存在することをテストするだけです (x == 0y == 1 の場合、((!x) | y) != (!(x | y)))。

  • ! 演算子が正しくありません。代わりに、~ である必要があります。

    ! 演算子にはブール型の結果がありますが、~ 演算子には算術演算の結果が含まれています。 これらの演算子は、ブール値 (0 または 1) を操作している場合でも、交換できません (x == 1y == 0 の場合、((!x) | y) != ((~x) | y))。

  • バイナリ演算子 | が正しくありません。代わりに、|| である必要があります。

    |時には交換||できますが、式の右側の評価を強制するため、同等ではありません。 この型の式の副作用は末期的になる場合があります。(!p | (*p == '\0')) は、p == NULL の場合、式の他の半分を評価するには逆参照する必要があります。

演算子が演算子の|右側にある場合!、この警告は報告されません。このケースは通常、正しくない演算子の比較的無害なケースに過ぎません。

コードを調べずに、この問題の重大度を判断するのは困難です。 目的のテストが行われていることを確認するために、コードを検査する必要があります。

この警告は、演算子または演算子の優先順位を使用するときに混乱を招く可能性があることを常に示します。

コード分析名: LOGICALNOTBITWISEOR

この警告が発生するコード例を次に示します。

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