Bases de la programmation en C

unsigned int i;
for (i = 3; i >= 0; i--)
    printf("%u ", i);

unsigned int fait 32 bits. Quel est le comportement du code ci-dessus à l'exécution ?

  1. AIl affiche 3 2 1 0 et se termine
  2. BIl affiche 3 2 1 et se termine
  3. CAprès avoir affiché 3 2 1 0, il ne se termine pas et continue d'afficher des valeurs décroissantes à partir de 4294967295
Afficher la réponse et l'explication

Réponse : C. Après avoir affiché 3 2 1 0, il ne se termine pas et continue d'afficher des valeurs décroissantes à partir de 4294967295

i est non signé : il ne peut jamais devenir négatif, et la condition i >= 0 est toujours vraie. Exécuter i-- quand i vaut 0 le fait revenir à 2³² − 1 = 4294967295, et la boucle ne se termine pas : elle continue d'afficher 4294967294, 4294967293, etc. Pour compter à rebours jusqu'à 0, on utilise un int, ou on change l'écriture de la boucle, comme dans for (i = 4; i-- > 0; ). Avec gcc, l'option -Wextra avertit que cette comparaison est toujours vraie.

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

Autres questions sur Bases de la programmation en C

  1. Un programme qui exécute « char c = 200; » puis affiche c avec %d dans printf affiche −56 lorsqu'il est compilé et exécuté avec gcc pour Linux sur x86-64, et 200 avec gcc pour Linux sur Arm. Quelle est la raison de cette différence ?
  2. Quelle est la sortie obtenue en exécutant le code ci-dessus, où b++ est écrit à droite de && et de || ?
  3. Quelle est la sortie obtenue en exécutant l'instruction switch ci-dessus, qui contient un case sans break ?
  4. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
  5. Lorsque la fonction f ci-dessus est appelée trois fois de suite, quelle est la valeur de retour du troisième appel ?