Freigeben über


C6290

C6290

Warnung C6290: Bitweise Operation auf logischem Ergebnis: ! hat Vorrang vor &. Verwenden Sie stattdessen && oder (!(x & y)).

Diese Warnung weist auf eine Unklarheit im Zusammenhang mit der Verwendung eines Operators bzw. der Rangfolge von Operatoren hin.

Der !-Operator erzeugt ein boolesches Ergebnis und hat Vorrang vor dem &-Operator. Da der bitweise AND-Operator (&) zwei arithmetische Argumente verwendet, wurde einer der folgenden Fehler erkannt:

  • Die Klammern im Ausdruck sind falsch gesetzt:

    Da das Ergebnis von ! boolesch, also 0 (null) oder 1, ist, hat der Test, ob zwei Variablen gemeinsame Bits aufweisen, als Ergebnis zur Folge, dass sich das niedrigste Bit auf der rechten Seite befindet: ((!8) & 1) == 0.

  • Der !-Operator ist ungültig; stattdessen sollte ~ verwendet werden:

    Der !-Operator ergibt ein boolesches Ergebnis, der ~-Operator hingegen ein arithmetisches Ergebnis. Diese Operatoren sind nicht austauschbar, auch nicht bei Verwendung mit einem booleschen Wert (0 (null) oder 1): ((!0x01) & 0x10) == 0x0, wohingegen ((~0x01) & 0x10) == 0x10.

  • Der binäre &-Operator ist ungültig; stattdessen sollte && verwendet werden:

    Obwohl & manchmal gegen && ausgetauscht werden kann, sind die Operatoren nicht äquivalent, denn der AND-Operator erzwingt die Auswertung der rechten Seite des Ausdrucks. Bestimmte Nebeneffekte bei diesem Ausdruckstyp können zum Abbruch führen.

Ohne den Code zu untersuchen, ist es schwierig, die Auswirkungen dieses Problems zu beurteilen. Der Code sollte überprüft werden, um sicherzustellen, dass der beabsichtigte Test ausgeführt wird.

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 erzeugt, wenn sich der !-Operator auf der rechten Seite des &-Operators befindet.

Siehe auch

Referenz

C6317