次の方法で共有


C6290

警告 C6290: 論理演算結果に対してビットごとの演算を行っています: & よりも ! が優先されます。代わりに、&& または (!(x & y)) を使用します

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

! の演算子はブール型の結果が得られる、&より高い優先順位を持ちます。ビットごとの AND (&) 演算子は 2 個の数値型引数を受け取ります。そのため、次のいずれかのエラーが検出されました。

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

    ! の結果がブール型 (0 または 1) なので、2 つの変数が共通のビットを持つことを確認しようとしても、最下位ビットが右側にあることが確認されるだけです。たとえば ((!8) & 1) == 0 の場合です。

  • ! 演算子が適切ではありません。代わりに ~ を使用する必要があります。

    ! 演算子の結果はブール型で、~ 演算子の結果は数値型です。ブール値 (0 または 1) を使用する場合にも、これらの演算子を相互に置き換えることはできません。((!0x01) & 0x10) == 0x0 であり、((~0x01) & 0x10) == 0x10 です。

  • 二項演算子 & は不適切なので、代わりに && を使用する必要があります。

    & が && と同じ意味を持つ場合もありますが、この場合は式の右側の評価が強制されるため、同等ではありません。この種類の式の一部の副作用は致命的です。

コードを調べない限り、この問題の深刻性を判断することは困難です。意図したとおりのテストが実行されることを確認するには、コードを調べる必要があります。

使用例

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

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