Condividi tramite


C6290

Aggiornamento: novembre 2007

C6290

avviso C6290: Operazione bit per bit su risultato logico: ! ha maggiore precedenza di &. Utilizzare && o (!(x & y))

L'avviso indica una possibile confusione nell'utilizzo di un operatore o di una precedenza di operatori.

L'operatore ! genera un risultato Boolean e ha una precedenza maggiore rispetto a &.L'operatore AND bit per bit (&) utilizza due algoritmi aritmetici, pertanto è stato rilevato uno dei seguenti errori:

  • L'utilizzo delle parentesi nell'espressione non è corretto.

    Poiché il risultato di ! è un valore Boolean (zero o uno), un tentativo di verificare che due variabili abbiano bit in comune potrà solo verificare che il bit di valore più basso si trovi a destra: ((!8) & 1) == 0.

  • L'operatore ! non è corretto e dovrebbe corrispondere a ~.

    L'operatore ! ha un risultato Boolean, mentre ~ ha un risultato aritmetico. Tali operatori non sono mai interscambiabili, nemmeno quando utilizzano un valore Boolean (zero o uno): ((!0x01) & 0x10) == 0x0, mentre ((~0x01) & 0x10) == 0x10.

  • L'operatore binario & non è corretto e dovrebbe corrispondere a &&.

    Anche se in alcuni casi è possibile interscambiare & e &&, 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.

È difficile giudicare la gravità del problema senza esaminare il codice: dovrebbe essere verificato per garantire che venga effettuato il test previsto.

Esempio

Il codice seguente genera questo avviso:

void f(int x, int y)
{
  if (!x & y)
  {
    // code ..
  }
}

Per risolvere il problema, utilizzare 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 riportato se l'operatore ! si trova a destra dell'operatore &.

Vedere anche

Riferimenti

C6317