Valeurs obtenues en cas de fonction récursive

Quelqu’un peut-il m’expliquer pourquoi le résultat de ce programme est 0 0 0 0 0 ?

Nous utilisons ici une static variable var dont les valeurs ne changeront pas en raison des appels de fonction. Les valeurs de var seront 4, 3, 2, 1 lors des appels récursifs. Lorsque var devient zéro, la récursivité prend fin et le contrôle passe à l’instruction printf .

Pourquoi la sortie n’est pas 1,2,3,4 ?

  main(){ static int var=5; if(--var) main(); printf(" %d ",var); } 

Encore une fois si vous utilisez si condition var-- alors la sortie du programme sera -1 -1 -1 -1 -1 -1 ?

Dans votre appel printf() s’exécute lorsque main() revient. Et comme var est une static variable sa valeur rest 0 (dernière valeur = 0 identique pour tout appel de fonction)

Notez if() condition if() fausse lorsque var devient 0 (dernière valeur, après main (); appelez vous ne changez pas le diagramme var – notice).

J’espère que le diagramme suivant vous aidera à comprendre (lisez les commentaires):

 main() <---------------+ { | static int var=5; | <----"Declared only one/first time with value 5" if(--var) | ---- main(); ---------+ // called if var != 0 | // main called for var = 4, 3, 2, 1 |// recursion stooped |// return with 0 value |// now no operation applied on `var` so it remain 0 +--> printf(" %d ",var); // called when return ed } 

La durée de vie restante de la fonction statique dure jusqu’à ce que le programme se termine (ainsi, les valeurs ne sont pas perdues), et la scope est dans la fonction.

14.1.6 Variables statiques

La scope des variables automatiques statiques est identique à celle des variables automatiques, c’est-à-dire qu’elle est locale au bloc dans lequel elle est définie; Cependant, le stockage alloué devient permanent pour la durée du programme. Les variables statiques peuvent être initialisées dans leurs déclarations; toutefois, les initialiseurs doivent être des expressions constantes et l’initialisation est effectuée une seule fois lors de la compilation, lorsque la mémoire est allouée pour la variable statique * .

Deuxième question:

Encore une fois si vous utilisez var-- alors votre sortie sera -1 -1 -1 -1 -1 -1 ?

Supposons que si votre condition sera var-- alors la if() vérifie si elle est true ou false avant de décrémenter -- . (car dans l’expression var-- , -- est postfixe).
Et parce que if() rompt lorsque var == 0 appel récursif s’arrête et la fonction retourne avec une valeur décrémentée comprise entre 0 et -1 . Et comme après le retour, var ne change pas, donc la sortie est -1 pour tous.

Les valeurs de var seront 4, 3, 2, 1 lors des appels récursifs. Lorsque var devient zéro, la récursivité se termine et le contrôle passe à l’instruction printf() Pourquoi la sortie n’est-elle pas 1, 2, 3, 4 ?

Une variable statique est une variable allouée de manière statique, dont la durée de vie ou son “étendue” s’étend sur toute la durée du programme.

Ainsi, la valeur de var change à chaque fois et enfin, elle devient 0 et printf() exécuté après le retour de main. Comme la valeur de var est 0 , chaque instruction printf() affichera 0 .

Les variables statiques sont les variables dont la durée de vie rest égale à la durée de vie du programme. Les variables statiques get sont initialisées une fois . La valeur de la variable changera après chaque appel système. Si vous n’aviez pas déclaré la variable statique, une récursion infinie aurait entraîné une erreur de segmentation .