Condividi tramite


Avviso C6290

Operazione bit per bit sul risultato logico: ! ha una precedenza maggiore di &. Usa && o (!( x & y))

Questo avviso indica una possibile confusione nell'uso di un operatore o di una precedenza dell'operatore.

Osservazioni:

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 & .

Vedi anche