c++ - pagina - Diferencias de programa de Scoping dinámicas y estáticas
librerias dinamicas c++ (6)
Considere el siguiente fragmento de código
int x=10;
Aquí el valor 10 se almacena en una ubicación particular en la memoria y el nombre ''x'' está vinculado a esa ubicación.
El alcance es la parte del programa donde esta vinculación es válida. En palabras simples, la parte del programa donde la variable es visible.
La "parte del programa" puede referirse a una parte particular del código (ámbito estático) o a una parte del tiempo de ejecución (ámbito dinámico) , donde esta vinculación es válida.
En este caso
int x; //X1
int main() {
x = 14;
f();
g();
}
void f() {
int x = 13; //X2
h();
}
void g() {
int x = 12; //X3
h();
}
void h() {
printf("%d/n",x);
}
X1 se puede acceder a cualquier parte del programa. Entonces en main () X1 tiene asignado el valor 14.
Cuando se invoca f (), se crea una nueva variable (almacenada en una nueva ubicación de memoria) ''x'' (X2) local a f () e inicializa el valor 13 y cuando se invoca g (), de manera similar, otra variable nueva ''x ''(X3) local a g () con el valor 12 creado.
En scoping estático
cuando f () o g () llama a h (), X2 y X3 no son visibles fuera de f () y g () respectivamente ( parte del código ), mientras que X1 es visible globalmente, por lo que la salida será
14
14
En el alcance dinámico Cuando f () se ejecuta, el nombre ''x'' está vinculado a X2 y cuando f () llama a h (), la función f () todavía se está ejecutando y el nombre ''x'' sigue vinculado a X2, por lo que el X2 local se imprimirá en la salida. Después de que se ejecuta f (), este enlace no existe ( parte del tiempo de ejecución ) y ''x'' está vinculado a X1. Y cuando g () se ejecuta, el nombre ''x'' está enlazado a X3.Y cuando se invoca h (), f () aún se está ejecutando y el nombre ''x'' todavía está enlazado a X3, por lo que el X3 local se imprimirá y la salida será
13
12
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 se usa el alcance estático, ¿cuál es el resultado? Si se utiliza el alcance dinámico, ¿cuál es el resultado?
Ahora bien, si entiendo bien el alcance, la diferencia entre el alcance estático y el dinámico es estático hace que las variables sean locales para una clase. Entonces, el valor X sería local para void f (), Void g () e int main () y dinámico los haría disponibles globalmente. Simplemente no estoy seguro de cómo aplicarlo a este código. si se usara estática, ¿solo imprimiría el último valor (12 de void g ()) y la dinámica usaría todos los valores de X?
Estoy un poco confundido sobre cómo funciona realmente el alcance. Sin embargo, sé que C usa el alcance estático.
El alcance estático significa que x
refiere al alcance de declaración más interno declarado x
que tiene uno. Dado que h
se declara dentro del alcance global, la x
más interna es la del alcance global (no tiene acceso a las x
s en f
g
, ya que no se declaró dentro de ellas), por lo que el programa imprime 14
dos veces.
El alcance dinámico significa que x
refiere a la x
declarada en el marco más reciente de la pila de llamadas que tiene. Si C usó el alcance dinámico, h
usaría la x
de f
o g
, cualquiera que la llamara, para que el programa imprimiera 13
y 12
.
En el ámbito estático, el alcance de un identificador está determinado por su ubicación en el código, y como eso no cambia, el alcance tampoco. En el ámbito dinámico, el alcance está determinado por la secuencia de llamadas que ha llevado al uso de un identificador, y dado que puede ser diferente cada vez que se alcanza ese uso, es dinámico.
En su ejemplo, bajo el alcance estático, la x en h siempre será la x global, independientemente de cómo se haya llamado h. Pero con el alcance dinámico, se referiría a la x declarada en f o la declarada en g, dependiendo de quién la haya llamado h en ese momento en particular.
C / C ++ no usa el alcance dinámico. Su lenguaje de programación utilizará uno u otro, no puede elegir (a menos que esté usando Clojure, según Idan Arye a continuación).
Aquí hay una gran explicación / comparación con un buen ejemplo: http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/
Esta es la ans exactamente probada en
alcance estático : una vez que a la variable global se le asigna un valor, su alcance existirá a lo largo de la ejecución del programa. Por lo tanto, la respuesta para esto es: 14
y 14
Cuando el lenguaje C posee un alcance estático, puede verificarlo en el compilador TURBO-C.
Donde como cuando vienes a
Alcance dinámico : Independientemente del valor de la variable global. Se considera el valor asignado en el bloque. por lo tanto, la respuesta es: f()=13
g()=12
Ámbito estático: el alcance estático se refiere al alcance de la variable que se define en tiempo de compilación. Siempre se refiere a la variable con entorno de nivel superior.
En este programa, el resultado del alcance estático es 14 y 14 porque f () y g () siempre devuelven el valor de la variable global x. f () y g () no dependen de quién los está llamando.
Alcance dinámico: el alcance dinámico se refiere al alcance de una variable que se define en tiempo de ejecución. Se refiere al identificador con el entorno más reciente. Es algo así como la programación dinámica porque en dp el valor se actualiza.
En este programa, el resultado del alcance dinámico son 13 y 12 porque f () y g () devuelven la variable actual valor x no el valor global.
Referencia: GeeksforGeeks