Share via


警告 C6290

論理結果に対するビットごとの演算: ! は 、> よりも高い優先順位を持っています。 (!(x & y)) を代わりに使用します。

この警告は、演算子または演算子の優先順位を使用する際に混合が起こる可能性があることを示します。

解説

! 演算子は、ブール値の結果になるので、& より優先順位が高くなります。 ビットごとの演算子と (> 演算子は、2 つの算術引数を受け取ります。 そのため、次のエラーのいずれかが検出されました。

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

    ! の結果はブール値 (0 または 1) であるため、2 つの変数にビットがあることをテストしようとすると、通常は右側に最低ビットが存在することをテストするだけになります (((!8) & 1) == 0)。

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

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

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

    交換できる&&場合もありますが&、式の右側の評価を強制するため、同等ではありません。 この型の式の特定の副作用は、ターミナルになる可能性があります。

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

コード分析名: LOGICALNOTBITWISEAND

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

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 がレポートされます。

関連項目