web-dev-qa-db-fra.com

Différences de programme de portée dynamiques et statiques

int x;

int main() {
   x = 14;
   f(); 
   g();
}

void f() {
   int x = 13;
   h();
}

void g() {
   int x = 12;
   h();
}

void h() {
   printf("%d\n",x);  
}

Si la portée statique est utilisée, quel est le résultat? Si la portée dynamique est utilisée, quel est le résultat? 

Maintenant, si je comprends bien la portée de la portée, la différence entre la portée statique et dynamique est que statique rend les variables locales à une classe. Ainsi, la valeur x serait locale pour void f(), void g() et int main () et dynamique les rendrait disponibles globalement. Je ne suis pas sûr de savoir comment l'appliquer à ce code. Si la portée statique était utilisée, la dernière valeur serait-elle uniquement affichée (12 de void g()) et la portée dynamique utiliserait toutes les valeurs de x?

Je suis un peu confus sur la façon dont fonctionne la portée. Je sais que C utilise cependant une portée statique.

32
user1789951

Portée statique signifie que x fait référence à la x déclarée la plus proche portée de la déclaration qui en a une. Puisque h est déclaré dans la portée globale, la plus interne x est celle de la portée globale (il n'a aucun accès aux xs dans f et g, car il n'a pas été déclaré à l'intérieur), le programme imprime donc 14 deux fois.

La portée dynamique signifie que x fait référence à la x déclarée dans la plus récente trame de la pile d'appels the en a une. Si C utilisait la portée dynamique, h utiliserait la x de f ou g - celle qui l’appelle - afin que le programme imprime 13 et 12.

38
Idan Arye

C/C++ n'utilise pas la portée dynamique. Votre langage de programmation utilisera l’un ou l’autre, vous ne pourrez pas choisir (sauf si vous utilisez Clojure! Selon Idan Arye ci-dessous).

Voici une excellente explication/comparaison avec un bon exemple: http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/

13
Jason Enochs

Dans la portée statique, la portée d'un identificateur est déterminée par son emplacement dans le code, et puisque cela ne change pas, la portée ne change pas non plus. Dans la portée dynamique, la portée est déterminée par la séquence d'appels qui a conduit à l'utilisation d'un identifiant, et étant donné que cet identifiant peut être différent à chaque utilisation, il est dynamique.

Dans votre exemple, sous portée statique, le x dans h sera toujours le x global, quelle que soit la méthode utilisée pour appeler h. Mais avec la portée dynamique, cela ferait référence au x déclaré dans f ou à celui déclaré dans g, en fonction de celui qui avait appelé h ce moment particulier.

2
Scott Hunter

C'est exactement le prouvé ansin 

statique scoping : Une fois que la variable globale est affectée à une valeur, sa portée existera tout au long de l'exécution du programme . Par conséquent, la réponse à cette question est: 14 et 14.Le langage C possède une portée statique que vous pouvez archiver Compilateur TURBO-C.

Où comme quand tu viens à

Portée dynamique : Indépendamment de la valeur de la variable globale. La valeur affectée dans le bloc est considérée . Par conséquent, la réponse est: f()=13 et g()=12

0
Naveen Kuntla

Portée statique: Portée statique fait référence à la portée de la variable définie lors de la compilation. Il fait toujours référence à la variable avec l’environnement de niveau supérieur.
Dans ce programme, le résultat de la portée statique est 14 et 14 car f() et g() renvoient toujours la valeur de la variable globale x. f() et g() ne dépendent pas de ceux qui les appellent.

Portée dynamique: La portée dynamique fait référence à la portée d'une variable définie au moment de l'exécution. Il fait référence à l'identifiant avec l'environnement le plus récent. Cela ressemble à de la programmation dynamique car dans dp, la valeur est mise à jour.
Dans ce programme, les résultats de la portée dynamique sont 13 et 12 car f() et g() renvoient la variable actuelle x valeur et non la variable globale.

Référence: GeeksforGeeks

0
rashedcs