Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Operazione bit per bit sul risultato logico: ! ha una precedenza maggiore di &. Usa && o (!( x & y))
Osservazioni:
Questo avviso indica una possibile confusione nell'uso di un operatore o di una precedenza dell'operatore.
L'operatore ! restituisce un risultato booleano e ha una precedenza maggiore rispetto a &. L'operatore bit per bit e (&) accetta due argomenti aritmetici. Di conseguenza, è stato rilevato uno degli errori seguenti:
L'espressione non è racchiusa tra parentesi:
Poiché il risultato di
!è booleano (zero o uno), un tentativo di testare che due variabili hanno bit in comune finirà solo per verificare che il bit più basso sia presente sul lato destro:((!8) & 1) == 0.L'operatore
!non è corretto e deve essere invece:~L'operatore
!ha un risultato booleano, mentre l'operatore~ha un risultato aritmetico. Questi operatori non sono mai intercambiabili, anche quando si opera su un valore booleano (zero o uno):((!0x01) & 0x10) == 0x0, mentre((~0x01) & 0x10) == 0x10.L'operatore
&binario non è corretto e deve essere&&:Anche se
&a volte può essere interscambiato con&&, non è equivalente perché forza la valutazione del lato destro dell'espressione. Alcuni effetti collaterali in questo tipo di espressione possono essere terminale.
È difficile giudicare la gravità di questo problema senza esaminare il codice. Il codice deve essere controllato per assicurarsi che si verifichi il test previsto.
Nome dell'analisi del codice: LOGICALNOTBITWISEAND
Esempio
Il codice seguente genera questo avviso:
void f(int x, int y)
{
if (!x & y)
{
// code ..
}
}
Per correggere questo avviso, usare il codice di esempio seguente:
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 ...
}
}
L'avviso C6317 viene segnalato se l'operatore ! si trova sul lato destro dell'operatore & .