Freigeben über


Warnung C6290

Bitweiser Vorgang auf logisches Ergebnis: ! hat eine höhere Priorität als &. && oder (!( x & y)) stattdessen

Diese Warnung weist auf eine mögliche Verwechslung bei der Verwendung eines Operators oder einer Operatorrangfolge hin.

Hinweise

Der ! Operator liefert ein boolesches Ergebnis und hat eine höhere Rangfolge als die &. Der Bitweise- und (&)-Operator verwendet zwei arithmetische Argumente. Daher wurde einer der folgenden Fehler erkannt:

  • Der Ausdruck ist falsch klammert:

    Da das Ergebnis von ! Boolean (null oder eins) ist, versucht, zu testen, dass zwei Variablen Bits gemeinsam haben, führt nur zu Testzwecken, dass das niedrigste Bit auf der rechten Seite vorhanden ist: ((!8) & 1) == 0.

  • Der ! Operator ist falsch und sollte stattdessen folgendes ~ sein:

    Der ! Operator hat ein boolesches Ergebnis, während der ~ Operator ein arithmetisches Ergebnis hat. Diese Operatoren sind niemals austauschbar, auch wenn sie auf einem booleschen Wert (null oder eins) ausgeführt werden: ((!0x01) & 0x10) == 0x0, während ((~0x01) & 0x10) == 0x10.

  • Der binäre Operator & ist falsch und sollte stattdessen folgendes sein &&:

    Obwohl & es manchmal austauschbar &&ist, ist es nicht gleichwertig, da es die Auswertung der rechten Seite des Ausdrucks erzwingt. Bestimmte Nebenwirkungen in dieser Art von Ausdruck können terminal sein.

Es ist schwierig, den Schweregrad dieses Problems zu beurteilen, ohne den Code zu untersuchen. Der Code sollte überprüft werden, um sicherzustellen, dass der beabsichtigte Test auftritt.

Codeanalysename: LOGICALNOTBITWISEAND

Beispiel

Der folgende Code generiert diese Warnung:

void f(int x, int y)
{
  if (!x & y)
  {
    // code ..
  }
}

So korrigieren Sie die Warnung unter Verwendung des folgenden Beispielcodes

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

Warnung C6317 wird gemeldet, wenn sich der ! Operator auf der rechten Seite des & Operators befindet.

Siehe auch