#include <stdio.h>
void main()
{
int x = 1, y = 0, z = 5;
int a = x && y || z++;
printf("%d", z);
}
A 0
B 5
C 6
D Autres
C
Dans ce code C, l’expression x && y || z++ est évaluée selon la priorité des opérateurs : l’opérateur && est prioritaire par rapport à ||. On commence donc par x && y : 1 && 0 donne 0 (faux). Ensuite, on évalue 0 || z++ : comme la première partie est fausse, l’opérateur || doit évaluer la deuxième partie, donc z++ est exécuté. La valeur de z passe alors de 5 à 6. Le programme affiche donc 6.
2. Quelle est la sortie de ce code C ?
#include <stdio.h>
void main()
{
int x = 1, y = 0, z = 5;
int a = x && y && z++;
printf("%d", z);
}
A 0
B 6
C 5
D Autres
C
Dans ce code C, l’expression x && y && z++ utilise l’opérateur logique ET (&&) qui applique l’évaluation en court-circuit. Comme x vaut 1 (vrai) et y vaut 0 (faux), l’expression x && y est déjà fausse, donc le langage C n’évalue pas la partie suivante z++. L’incrémentation de z n’est donc jamais exécutée et sa valeur reste 5. Le programme affiche donc 5.
3. Quelle est la sortie de ce code C ?
#include <stdio.h>
int main()
{
int a = 1, b = 0, c = 3;
a > b ? printf("%d", c) : return c;
}
A 1
B 3
C Erreur d’exécution
D Erreur de compilation
C
La sortie:
error: expected expression before 'return'
a > b ? printf("%d", c) : return c;
^
Nous ne pouvons pas mettre « return » dans une condition ternaire. Pour effectuer ce genre d’instruction nous utilisons l’instruction « if » comme indiqué ci-dessous:
#include <stdio.h>
int main()
{
int a = 1, b = 0, c = 3;
if(a > b )
printf("%d", c);
else
return c;
}
4. Quelle est la sortie de ce code C ?
#include <stdio.h>
void main()
{
int a = 1, c = 3;
int b = a << 3;
printf(" %d\n", b);
}
A 8
B 1
C -724794438
D Erreur d’exécution
A
Dans ce code C, l’opérateur << effectue un décalage à gauche des bits. La valeur de a est 1, qui s’écrit en binaire sur 8 bits : 0000 0001. L’expression a << 3 décale tous les bits de 3 positions vers la gauche, ce qui donne 0000 1000 en binaire, soit la valeur décimale 8. Ainsi, la variable b contient 8 et le programme affiche cette valeur.
5. Quelle est la sortie de ce code C ?
#include <stdio.h>
void main()
{
int a = 0, b = 2, c = 3;
int x = a & b | c;
printf("%d", x);
}
A 2
B 3
C 0
D Dépend du compilateur
B
ET bit-à-bit
ET bit-à-bit est un opérateur binaire (opère sur deux opérandes). Il est noté par &. L’opérateur & compare les bits correspondants de deux opérandes. Si les deux bits sont à 1, cela donne 1. Si l’un des bits n’est pas à 1, il donne 0. Par exemple le ET bit-à-bit de a & b :
a = 0 (en décimal) = 00000000 (en binaire) b = 2 (en décimal) = 00000010 (en binaire)
Opération binaire ET bit-à-bit de 0 et 2
00000000
& 00000010
__________
= 00000000 = 0 (en décimal)
Ou bit-à-bit est un opérateur binaire (opère sur deux opérandes). C’est noté |.
L’opérateur | compare les bits correspondants de deux opérandes. Si l’un des bits est 1, il donne 1. Sinon, il donne 0. Par exemple le OU bit-à-bit de (a & b) | c:
(a & b) = 0 (en décimal) = 00000000 (en binaire) c = 3 (en décimal) = 00000011 (en binaire)
Opération binaire Ou bit-à-bit de 0 et 3
00000000
| 00000011
__________
= 00000011 = 3 (en décimal)
6. Quelle est la sortie de ce code C ?
#include <stdio.h>
int main()
{
int a = 0, b = 0;
if (a && (b = a + 10))
//faire quelque chose
;
;
}
A 10
B 0
C Dépend du compilateur
D Dépend de la norme
B
Le compilateur C le plus récent (actuellement C99 avec quelques modifications) retourn 0 par défaut, s’il n’y a pas d’instruction de retour explicite à la fin de la fonction.
7. Quelle est la sortie de ce code C ?
#include <stdio.h>
int main()
{
int a = 10, b = 0;
if (a || (b = a + 10))
//faire quelque chose
;
;
}
A 20
B 0
C Dépend du compilateur
D Dépend de la norme
B
Dans ce code C, la condition a || (b = a + 10) utilise l’opérateur logique OU (||) qui applique une évaluation en court-circuit. Comme a vaut 10, il est considéré comme une valeur vraie, donc la première partie a suffit pour rendre toute l’expression vraie. La deuxième partie (b = a + 10) n’est donc jamais exécutée, et la variable b conserve sa valeur initiale 0. Le programme affiche donc 0.
8. Quelle est la sortie de ce code C ?
#include <stdio.h>
int main()
{
int a = 1;
if (a++ && (a == 1))
printf("Oui\n");
else
printf("Non\n");
}
A Non
B Oui
C Dépend du compilateur
D Dépend de la norme
A
Dans ce code C, l’expression de la condition est a++ && (a == 1). Au début, a vaut 1. L’opérateur a++ est un post-incrément, donc il retourne d’abord l’ancienne valeur 1 (vraie), puis incrémente a à 2. Comme la première partie est vraie, la deuxième partie (a == 1) est évaluée. À ce moment-là, a vaut 2, donc la condition est fausse. Le programme exécute donc le bloc else et affiche « Non ».
Au niveau de la réponse à la question 6, au moment où j’écris le standard C le plus récent est C17.
On a une erreur de compilation pour la question 7, aucun des choix proposés ne correspond.
Merci pour cette remarque 🙂