C6291
Warnung C6291: Bitweise Operation auf logischem Ergebnis: ! hat Vorrang vor |. Verwenden Sie stattdessen || oder (!(x | y)).
Der !-Operator gibt ein boolesches Ergebnis zurück, und der |-Operator (bitweises oder) 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 falsch und sollte stattdessen || sein:
Obwohl | manchmal gegen || ausgetauscht werden kann, sind die Operatoren nicht äquivalent, denn der Operator AND erzwingt die Auswertung der rechten Seite des Ausdrucks. 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 erzeugt, wenn sich der Operator ! auf der rechten Seite des Operators befindet. | Operators befindet, da dies in der Regel nur der relativ harmlose Fall eines falschen Operators 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
}
}