次の方法で共有


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