Partager via


C6290

avertissement C6290 : Opération de bits sur résultat logique : ! bénéficie d'une priorité supérieure à celle de &.Utiliser && ou (!(x & y)) à la place

Cet avertissement indique une confusion possible dans l'utilisation d'un opérateur ou d'une priorité d'opérateur.

L'opérateur ! renvoie un résultat booléen et est prioritaire sur l'opérateur &. L'opérateur d'opération de bits AND (&) accepte deux arguments arithmétiques.Par conséquent, l'une des erreurs suivantes a été détectée :

  • L'expression n'est pas mise correctement entre parenthèses :

    Étant donné que le résultat de ! est une valeur Boolean (zéro ou 1), une tentative visant à tester que deux variables ont des bits en commun revient à tester que le bit le plus faible est présent sur le côté droit : ((!8) & 1) == 0.

  • L'opérateur ! est incorrect, et doit être ~ :

    L'opérateur ! obtient un résultat Boolean, tandis que l'opérateur ~ obtient un résultat arithmétique.Ces opérateurs ne sont jamais interchangeables, même lorsqu'ils utilisent une valeur Boolean (zéro ou 1) : ((!0x01) & 0x10) == 0x0 et ((~0x01) & 0x10) == 0x10.

  • L'opérateur binaire & est incorrect, et doit être && :

    Bien que & puisse parfois être permuté avec &&, il n'est pas équivalent car il force l'évaluation du côté droit de l'expression.Certains effets secondaires dans ce type d'expression peuvent être terminaux.

Il est difficile d'évaluer la gravité de ce problème sans examiner le code.Ce dernier doit être analysé pour vérifier que le test correct est exécuté.

Exemple

Le code suivant génère cet avertissement :

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

Pour corriger cet avertissement, utilisez l'exemple de code suivant :

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'avertissement C6317 s'affiche si l'opérateur ! est présent sur le côté droit de l'opérateur &.

Voir aussi

Référence

C6317