Warnung C6291
Bitweiser Vorgang auf logisches Ergebnis: ! hat eine höhere Rangfolge als |. || verwenden oder (!( x | y)) stattdessen
Der !
Operator liefert ein boolesches Ergebnis, und der |
Operator (bitweise oder) verwendet zwei arithmetische Argumente. Der !
Operator hat auch eine höhere Rangfolge als |
.
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 festgelegt haben, wird nur getestet, dass das niedrigste Bit auf der rechten Seite vorhanden ist:((!x) | y) != (!(x | y))
wannx == 0
undy == 1
.Der
!
Operator ist falsch und sollte stattdessen folgendes~
sein:Der
!
Operator hat ein boolesches Ergebnis, aber der~
Operator hat ein arithmetisches Ergebnis. Diese Operatoren sind niemals austauschbar, auch wenn sie auf einem booleschen Wert (null oder eins) arbeiten:((!x) | y) != ((~x) | y)
wennx == 1
undy == 0
.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:(!p | (*p == '\0'))
wenn , wennp == NULL
, wir sie ableiten müssen, um die andere Hälfte des Ausdrucks auszuwerten.
Diese Warnung wird nicht gemeldet, wenn sich der !
Operator auf der rechten Seite des |
Operators befindet, da dieser Fall in der Regel nur der relativ harmlose Fall eines falschen Operators ist.
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.
Diese Warnung weist immer auf mögliche Verwirrung bei der Verwendung eines Operators oder einer Operatorrangfolge hin.
Codeanalysename: LOGICALNOTBITWISEOR
Beispiel
Der folgende Code generiert diese Warnung:
void f(int x, int y )
{
if (!x | y)
{
//code
}
}
Um diese Warnung zu korrigieren, verwenden Sie eines der Im folgenden Code gezeigten Beispiele:
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
}
}