Bases de la programmation en C

int a = 0, b = 0;
if (a++ && b++) { }
if (a++ || b++) { }
printf("%d %d\n", a, b);

Quelle est la sortie obtenue en exécutant le code ci-dessus, où b++ est écrit à droite de && et de || ?

  1. A2 0
  2. B2 1
  3. C2 2
Afficher la réponse et l'explication

Réponse : A. 2 0

&& n'évalue pas son côté droit si le côté gauche est faux, et || ne l'évalue pas si le côté gauche est vrai (évaluation en court-circuit). Dans le premier if, la valeur de a++ est 0, la valeur d'avant l'incrémentation, donc fausse : b++ n'est pas exécuté et seul a passe à 1. Dans le second if, la valeur de a++ est 1, donc vraie : là encore b++ n'est pas exécuté, et a passe à 2. Lorsque le côté droit contient une expression à effet de bord, comme ++ ou un appel de fonction, son exécution dépend de la valeur du côté gauche : il faut y prendre garde.

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

Autres questions sur Bases de la programmation en C

  1. Quelle est la sortie obtenue en exécutant l'instruction switch ci-dessus, qui contient un case sans break ?
  2. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
  3. Lorsque la fonction f ci-dessus est appelée trois fois de suite, quelle est la valeur de retour du troisième appel ?
  4. En C, quelle association des durées de vie de (1) une variable locale déclarée sans static dans une fonction, (2) une zone allouée par malloc et (3) une variable déclarée hors de toute fonction est correcte ?
  5. int fait 32 bits (valeur maximale 2147483647). Quelle est la plus grande valeur de n pour laquelle la fonction fact(n) ci-dessus renvoie correctement la factorielle de n, sans dépassement de capacité ?