Dynamique et statique de la Portée du programme de différences
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 statique de la portée est utilisé, quel est le résultat? Si dynamique de la portée est utilisé, quel est le résultat?
Maintenant, si je comprends la portée droit, la différence entre statique et dynamique de la portée est que statique permet de variables locales à une classe. Ainsi, la valeur x
local à void f()
, void g()
et int main ()
et dynamique de les rendre disponibles au niveau mondial. Je ne suis pas sûr de la façon de l'appliquer à ce code. Si statique de la portée a été utilisé serait-il imprimer uniquement la dernière valeur (12 void g()
) et dynamique de la portée serait d'utiliser toutes les valeurs de x
?
Je suis un peu confus sur la façon de cadrage fonctionne réellement. Je sais C
utilise statique de portée si.
- C++ a seulement statique de la portée.
Vous devez vous connecter pour publier un commentaire.
Statique signifie étendue que
x
se réfère à lax
déclaré intime champ d'application de la déclaration qui en possède un. Depuish
est déclarée à l'intérieur de la portée mondiale, le plus profondx
est la seule de la portée globale(il n'a pas accès à lax
s dansf
etg
, car il n'a pas été déclarée à l'intérieur d'eux), de sorte que le programme imprime14
deux fois.Dynamique de portée signifie que
x
se réfère à lax
déclaré dans la plus récente cadre de l'appel de la pile la a un. Si C utilisé dynamique de portée,h
serait d'utiliser lax
de soitf
oug
- quel que soit celui qui l'a appelé - de sorte que le programme serait d'imprimer13
et12
.x
est déclaré dans le champ d'application B. Si nous essayons de nous référer àx
de la portée, alors A est le centre le plus intime de la portée(puisque nous sommes à l'intérieur d'Un), mais ne contient pas dex
(puisqu'il est déclaré dans B). La condition "qui en a" indique que nous sommes à la recherche pour les intimes, portée parmi ceux qui déclarentx
- qui est B. Même chose pour la pile des appels de cadres dans la dynamique de portée.C/C++ n'est pas l'utilisation Dynamique de la portée. Votre langage de programmation permettra d'utiliser l'un ou l'autre, vous n'obtenez pas de choisir (Sauf si vous utilisez Clojure! selon Idan Arye ci-dessous).
Voici une bonne explication/comparaison avec un bon exemple:
http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/
Envisager l'extrait de code suivant
Ici la valeur 10 est stockée dans un emplacement particulier dans la mémoire et le nom de " x " est lié à cet emplacement.
La portée est la partie du programme où cette Liaison est valide. En termes simples, la partie du programme où la variable est visible.
"La partie du programme" peut se référer à une partie spécifique du code (Statique portée) ou partie de l'exécution (Dynamique étendue), où cette liaison est valide.
Dans ce cas
X1 peut être consulté n'importe où dans le programme. Donc dans main() X1 est affectée de la valeur 14.
Lorsque f() est appelé, une nouvelle variable(stockées dans un nouvel emplacement mémoire) 'x'(X2) local de f() est créé et initialisé à la valeur 13 et lorsque g() est invoquée,de même, une autre nouvelle variable 'x'(X3) local à g() avec la valeur 12 est créé.
En Statique portée
lorsque f()g() appelle h(), X2 et X3 ne sont pas visibles de l'extérieur de f() et g() respectivement(portion de code),tandis que X1 est visible au niveau mondial afin que la sortie sera
Dans la Dynamique portée
Lorsque f() exécute le nom " x "est lié à X2 et f() appelle h(),la fonction f() est toujours en cours d'exécution et le nom de" x " est toujours lié à X2 conséquent le X2 sera imprimé à la sortie. Après f() est exécutée,cette liaison n'existe pas(partie de l'exécution) et " x " est lié à X1. Et quand g() s'exécute , le nom de " x " est lié à X3.Et lorsque h() est invoquée, f() est toujours en cours et le nom de " x " est toujours lié à X3 conséquent le X3 sera imprimé et la sortie sera
Statique dans la portée, le champ d'application d'un identifiant est déterminée par son emplacement dans le code, et, depuis, ne change pas, la portée n'est pas non plus. Dans la dynamique de la portée, le champ d'application est déterminé par la séquence d'appels qui a conduit à l'utilisation d'un identifiant, et depuis, qui peut être différente à chaque fois que l'utilisation est atteint, est dynamique.
Dans votre exemple, en vertu de la statique de la portée, le x dans h sera toujours le global x, indépendamment de la façon dont h est venu à être appelé. Mais avec une dynamique étendue, il renvoie à l'x a déclaré dans f ou déclaré en g, en fonction de ce qui avait appelé h ce moment particulier.
C'est exactement prouvé sna
dans
statique portée: une Fois que la variable globale est attribuée une valeur de son champ d'application existent tout au long de l'exécution du programme.
Donc la réponse est :
14
et14
.comme le langage C possède statique portée u pouvez le vérifier en TURBO C compilateur.Où que lorsque u venir à
Dynamique de portée : quelle que soit la valeur de la variable globale .La valeur attribuée dans le bloc est considéré comme.
donc la Réponse est :
f()=13
etg()=12
Statique portée : Statique champ d'application se réfère à la portée de la variable qui est définie au moment de la compilation. Il est toujours fait référence à la variable avec le haut niveau de l'environnement.
Dans ce programme, le résultat de la statique de la portée est de 14 et 14 parce que f() et g() retourne toujours la valeur de la variable globale x. f() et g() ne dépend pas de qui sont les appelant.
Dynamique Étendue : Dynamique de la portée se réfère à la portée d'une variable est définie au moment de l'exécution. Il fait référence à l'identifiant avec la plus récente de l'environnement. C'est quelque chose comme la programmation dynamique, car en dp la valeur est mise à jour.
Dans ce programme, le résultat de la dynamique de la portée du 13 et 12, car f() et g() retourne la variable x la valeur pas le mondial.
Référence : GeeksforGeeks