C6291
avviso C6291: Operazione bit per bit su risultato logico: !ha maggiore precedenza di |.Utilizzare || o (!(x | y))
L'operatore ! produce un risultato Boolean e |l'operatore OR bit per bit utilizza due argomenti aritmetici.L'operatore ! ha inoltre una maggiore precedenza rispetto a|.
Pertanto è stato rilevato uno dei seguenti errori:
L'utilizzo delle parentesi nell'espressione non è corretto.
Poiché il risultato di ! è un valore booleano (zero o uno), un tentativo di verificare che due variabili abbiano bit impostati potrà solo verificare che il bit di valore più basso si trovi a destra: ((!x) | y) != (!(x | y)) quando x == 0 e y == 1.
L'operatore ! non è corretto e dovrebbe corrispondere a ~.
L'operatore ! ha un risultato booleano, mentre ~ ha un risultato aritmetico.Tali operatori non sono mai interscambiabili, nemmeno quando utilizzano un valore booleano (zero o uno): ((!x) | y) != ((~x) | y) quando x == 1 e y == 0.
Operatore binario | non è corretto e dovrebbe corrispondere a ||:
Anche se | può talvolta essere scambiato con ||, non possono ritenersi equivalenti, in quanto il primo operatore impone la valutazione a destra dell'espressione.Alcuni effetti collaterali in questo tipo di espressione possono essere terminali: è necessario dereferenziare a (!p | (*p == '\0')) quando p == NULL per poter valutare l'altra metà dell'espressione.
L'avviso non viene riportato se l'operatore ! si trova a destra | dell'operatore perché questo caso è in genere solo il caso relativamente innocuo di un operatore errato.
È difficile giudicare la gravità del problema senza esaminare il codice:solo un'accurata verifica garantisce che venga effettuato il test previsto.
L'avviso indica sempre una possibile confusione nell'utilizzo di un operatore o di una precedenza di operatori.
Esempio
Il codice seguente genera questo avviso:
void f(int x, int y )
{
if (!x | y)
{
//code
}
}
Per risolvere il problema, utilizzare uno dei metodi illustrati nel codice seguente:
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
}
}