Bases de la programmation en C

unsigned int reg = 0x04;
if (reg & 0x04 == 0x04)
    printf("ON\n");
else
    printf("OFF\n");

Le code ci-dessus a été écrit pour tester si le bit 2 de la valeur de registre reg vaut 1. Quel est le résultat de son exécution ?

  1. AON est affiché
  2. BOFF est affiché
  3. CUne erreur de compilation se produit, car & et == ne peuvent pas être écrits à la suite
Afficher la réponse et l'explication

Réponse : B. OFF est affiché

En C, la comparaison == a une priorité plus élevée que le ET bit à bit &. La condition est donc interprétée comme reg & (0x04 == 0x04) ; comme 0x04 == 0x04 vaut 1, on obtient 0x04 & 1 = 0, ce qui est faux, et OFF est affiché. Pour obtenir le sens voulu, on ajoute des parenthèses, comme dans (reg & 0x04) == 0x04. L'écriture est grammaticalement correcte et ne provoque pas d'erreur, mais l'option -Wall de gcc donne un avertissement.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. uint8_t est un type entier non signé de 8 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  2. uint8_t est un type entier non signé de 8 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui incrémente x 10 fois ?
  3. unsigned char fait 8 bits et int fait 32 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  4. uint8_t est un type entier non signé de 8 bits et int fait 32 bits. Quel est le résultat de l'exécution du code ci-dessus ?
  5. int et unsigned int font 32 bits. Quel est le résultat de l'exécution du code ci-dessus ?