Bases de la programmation en C

int fact(int n) {
    if (n <= 1)
        return 1;
    return n * fact(n - 1);
}

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é ?

  1. A12
  2. B13
  3. C20
Afficher la réponse et l'explication

Réponse : A. 12

fact s'appelle elle-même sous la forme n × fact(n − 1) et renvoie 1 lorsque n vaut 1 ou moins : c'est une fonction qui utilise la récursivité. 12! = 479001600 est inférieur à la valeur maximale d'un int, 2147483647, et se calcule correctement, mais 13! = 6227020800 dépasse ce maximum. Dans fact(13), la dernière multiplication, 13 × 479001600, provoque un dépassement de capacité d'entier signé, ce qui est un comportement indéfini. Par exemple, gcc sur x86-64 sans optimisation renvoie 1932053504, le reste de la division de 6227020800 par 2³², mais ce résultat n'est pas garanti. Pour des n plus grands, on utilise par exemple le type long long de 64 bits (jusqu'à n = 20).

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

Autres questions sur Bases de la programmation en C

  1. int fait 4 octets et un pointeur 8 octets. Si la valeur (l'adresse) d'un pointeur sur int p est 0x1000, quelle est la valeur de p + 3 ?
  2. int fait 4 octets et un pointeur 8 octets. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
  3. int fait 4 octets. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  4. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui porte sur un tableau de char contenant une chaîne ?
  5. Après les déclarations ci-dessus, on écrit l'une des instructions A « p = t; », B « *p = 'x'; », C « q = t; » ou D « *q = 'x'; ». Quelle combinaison indique celles qui provoquent une erreur de compilation ?