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’instructionprintf()
Pourquoi la sortie n’est-elle pas1, 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 .