Condividi tramite


C6291

Aggiornamento: novembre 2007

C6291

avviso C6291: operazione bit per bit su risultato logico: ! ha maggiore precedenza di |. Utilizzare || o (!(x | y))

L'operatore ! genera un risultato booleano, mentre l'operatore | (OR bit per bit) accetta due argomenti aritmetici. L'operatore ! ha inoltre una precedenza più alta 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.

  • 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: è necessario annullare il riferimento a (!p | (*p == '\0')) quando p == NULL per poter valutare l'altra metà dell'espressione.

L'avviso non viene segnalato se l'operatore ! si trova sul lato destro dell'operatore | in quanto si tratta del solo caso di operatore non corretto relativamente innocuo.

È 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
  }
}