QCM en programmation C – Opérateurs logiques et relationnels

QCM sur C avec des réponses pour la préparation des entretiens, des tests en ligne, des examens etc.

 
 

1. 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 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)

Vous pouvez utiliser notre outil pour convertir de décimal en binaire.
 

Ou bit-à-bit

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 ».

 

 

3 réflexions sur “QCM en programmation C – Opérateurs logiques et relationnels

  • juillet 24, 2020 à 12:53 am
    Permalien

    Au niveau de la réponse à la question 6, au moment où j’écris le standard C le plus récent est C17.

    Répondre
  • juillet 24, 2020 à 1:00 am
    Permalien

    On a une erreur de compilation pour la question 7, aucun des choix proposés ne correspond.

    Répondre
    • juillet 25, 2020 à 12:27 pm
      Permalien

      Merci pour cette remarque 🙂

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *