C6291
Aktualisiert: November 2007
C6291
Warnung C6291: Bitweise Operation auf logischem Ergebnis: ! hat Vorrang vor |. Verwenden Sie stattdessen || oder (!(x | y)).
Der !-Operator ergibt ein boolesches Ergebnis, und der |-Operator (bitweises OR) nimmt zwei arithmetische Argumente an. Der !-Operator hat zudem Vorrang vor |.
Aus diesem Grund 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 für zwei Variablen Bits festgelegt sind, als Ergebnis zur Folge, dass sich das niedrigste Bit auf der rechten Seite befindet: ((!x) | y) != (!(x | y)); dabei ist x == 0 und y == 1.
Der !-Operator ist ungültig; es sollte sich stattdessen um ~ handeln:
Der !-Operator ergibt ein boolesches Ergebnis, der ~-Operator hingegen ein arithmetisches Ergebnis. Dieses Operatoren sind nicht austauschbar, auch nicht bei Verwendung mit einem booleschen Wert (0 (null) oder 1): ((!x) | y) != ((~x) | y); dabei ist x == 1 und y == 0.
Der binäre Operator | ist ungültig; es sollte sich stattdessen um || handeln:
Obwohl | manchmal gegen || ausgetauscht werden kann, sind die Operatoren nicht äquivalent, denn hiermit wird die Auswertung auf der rechten Seite des Ausdrucks erzwungen. Bestimmte Nebeneffekte bei diesem Ausdruckstyp können zum Abbruch führen. Beispiel: (!p | (*p == '\0')); ist p == NULL, ist eine Dereferenzierung erforderlich, damit die andere Hälfte des Ausdrucks ausgewertet wird.
Diese Warnung wird nicht ausgegeben, wenn sich der der ! -Operator rechts vom |-Operator befindet, da es sich in diesem Fall lediglich um einen falschen Operator handelt, was ein relativ harmloser Fehler ist.
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.
Diese Warnung weist immer auf eine Unklarheit im Zusammenhang mit der Verwendung eines Operators bzw. der Rangfolge von Operatoren hin.
Beispiel
Der folgende Code generiert diese Warnung:
void f(int x, int y )
{
if (!x | y)
{
//code
}
}
Um diese Warnung zu korrigieren, verwenden Sie eine der Methoden, die im folgenden Code gezeigt wird:
void fC(int x, int y )
{
/* When checking whether any bits are set in either x or y. */
if (!(x | y))
{
// code
}
/* When checking whether bits are set in either */
/* the complement of x or in y. */
if ((~x) | y)
{
// code
}
}
#include <windows.h>
void f(int x, BOOL y )
{
/* When y is a Boolean or Boolean result. */
if ((!x) || y)
{
// code
}
}