Exercices - Opérateurs
Q1 : Qu'affiche ce programme ?
int main() {
if (1 == 1) { printf("1 = 1"); }
if (1 == 2) {
printf("1 = 2");
}
else { printf("1 != 2"); }
return 0;
}
Réponse
Le code affiche
1 = 1
1 != 2
On voit quelque chose de nouveau. Le premier if n'a pas de clause else à sa suite ! Et oui ça arrive. Ici, 1 est égal à 1 ! Donc on rentre dans la boucle if, et on affiche 1 = 1.
Ensuite, on teste si 1 est égal à 2. Comme ce n'est pas le cas, la condition n'est pas satisfaite, donc on passe dans la structure de contrôle alternative else, qui nous demande d'afficher 1 != 2
Q2 : Plus dur, qu'affiche ce programme ?
int main() {
int a = 5;
if (a < 1) {
if (a == 5) {
printf("ta\n");
} else {
printf("ren\n");
}
printf("tu\n");
} else {
printf("le!\n");
}
return 0;
}
Réponse
Il affiche le!.
Si vous avez pas compris pourquoi, alors BLOCS BLOCS BLOCS BLOCS !
Désolé si je vous ai fait extrêmement peur, mais au moins ça restera gravé à jamais dans votre mémoire jusqu'à vos derniers instants.
La clé, c'est le raisonnement par blocs, regardez comment c'est joli. Vous voyez la fonction main ? Écrivons là en repliant ses instructions sur elle-même, en version compacte si vous préférez :
int main() {
// code ...
}
En pseudo-code, j'ai le droit d'écrire comme ça, parce que j'ai envie. Pour l'instant rien de difficile, on a juste replié la fonction principale. Et pourtant c'est la clé pour le reste. On peut aussi replier les blocs if, et tous les autres :
int main() {
int a = 5;
if (a < 1) {
//code ...
} else {
printf("le!");
}
return 0;
}
Ici j'ai replié la première instruction if sur elle-même, c'est le premier test que l'ordinateur fait puisque c'est la première ligne qui arrive après l'affectation int a = 5.
L'ordinateur teste si a < 1, comme c'est faux (car 5 < 1 est faux), on ne rentre meme pas dans le bloc du if ! Pas la peine de s'embêter. Puisqu'on a un else, on rentre dedans, et on affiche le!.
En revanche, si la condition était vraie, alors on serait rentré dans l'instruction if et là il aurait fallu exécuter le reste, etc...
Q2.2 : Bonus question 2 ! la valeur de a change, qu'affiche le programme ?
int main() {
int a = -5;
if (a < 1) {
if (a == 5) {
printf("ta\n");
} else {
printf("ren\n");
}
printf("tu\n");
} else {
printf("le!\n");
}
return 0;
}
Réponse
Il affiche
ren
tu
Alors ? Si c'est encore compliqué, on peut essayer d'aller plus doucement.
L'ordinateur voit d'abord int a = -5. Ca c'est ok on connaît.
Ensuite il doit faire le test : a < 1. Dans notre cas, c'est vrai car -5 < 1. Comme la condition est vraie, on rentre dans le bloc du if, et on se rappelle que l'on éxécutera pas son bloc else ! C'est soit l'un soit l'autre.
Une fois dedans, l'ordinateur voit ça :
if (a == 5) {
printf("ta\n");
} else {
printf("ren\n");
}
printf("tu\n");
Donc on doit tester une autre condition : a == 5 dans notre cas est faux donc on ne rentre pas dans la boucle if, mais on exécute le code dans else, c'est à dire qu'on affiche ren !
Et là, après le else, on a encore une dernière instruction à éxécuter. Elle ne fait pas partie du if/else imbriqué, elle est en réalité dans le premier if dans lequel on est rentré. On affiche donc tu.