variable una que publica programacion globales estaticas ejemplos ejemplo declaracion c++ variables initialization declaration definition

c++ - una - variables estaticas c#



Orden de inicialización de la variable global C++ (3)

Además, considere:

#include <iostream> using namespace std; int f(); int g(); int a = f(); int b = g(); int main() { cout << a << " " << b; } int f() { b++; cout << "f" << endl; return 1; } int g() { cout << "g" << endl; return 2; }

El resultado es:

f g 1 2

Reemplazando b = g(); con b = 22; hace que se imprima 1 23 . La respuesta de Kerrek SB explica por qué es así.

No entiendo lo que hace el siguiente ejemplo de código y cómo lo hace:

#include <stdio.h> int f(); int a = f(); // a exists just to call f int x = 22; int f() { ++x; return 123; // unimportant arbitrary number } int main() { printf("%d/n", x); }

Cuando esto se ejecuta, imprime 23 , que es la respuesta intuitiva.

Sin embargo, en C ++, las variables globales se deben inicializar en orden de definición. Eso significaría que a debe inicializarse antes de x , porque está definido antes de x . Si ese fuera el caso, entonces la función f debería llamarse antes de que x se inicializara, porque la llamada a f es parte de la definición de una.

Si efectivamente se llama f antes de que x se inicialice, eso significaría que f trataría de incrementar x - el resultado del cual no estoy realmente seguro (probablemente UB, o algún valor de galimatías). Luego, después de que a se inicializa, x se inicializaría a 22 y el programa imprimiría 22 .

Evidentemente, eso no es lo que sucede. Pero que hace? ¿Qué hace ese código en realidad?

Definitivamente parece que x se establece en 22 antes de que se evalúe a a = f() , pero eso significaría que el orden de inicialización está invertido (también podría estar equivocado sobre qué es la inicialización o cuándo sucede).


El problema es un poco sutil; por favor, consulte C ++ 11 3.6.2 para más detalles.

Lo que nos importa es que hay dos fases de inicialización de "variables no locales con duración de almacenamiento estático" (o "variables globales" en el lenguaje coloquial): la fase de inicialización estática y la fase de inicialización dinámica . La fase estática es lo primero. Se parece a esto:

int a = 0; int x = 22;

La inicialización dinámica se ejecuta después:

a = f();

El punto es que la inicialización estática no se "ejecuta" en absoluto; solo consiste en establecer valores que se conocen en tiempo de compilación, por lo que esos valores ya están establecidos antes de que ocurra cualquier ejecución. Lo que hace que la inicialización int x = 22; estático es que el inicializador es una expresión constante.

Hay casos en los que la inicialización dinámica se puede elevar a la fase estática (pero no es necesario), pero este no es uno de esos casos, porque no cumple con el requisito de que

la versión dinámica de la inicialización no cambia el valor de ningún otro objeto del ámbito del espacio de nombres antes de su inicialización

Cuando ocurre este izado, es permisible que los valores iniciales resultantes puedan ser diferentes de si no sucedieron. Hay un ejemplo en el estándar para una de estas inicializaciones "indeterminadas".


Siempre puede volver a escribir su programa de esta manera:

#include <stdio.h> int f(int x) { ++x; return x; } int main() { printf("%d/n", f(22)); }