initialize enclosed brace c++ initialization initialization-order

enclosed - initialize vector c++ 11



¿Es esta autoinicialización válida? (4)

Mi pregunta es si el comportamiento del programa está definido o no definido si es válido en absoluto. Si está definido, ¿se conoce el valor de x en main?

Este código definitivamente no es limpio, pero para mí debería funcionar de manera predecible.

int x pone la variable en el segmento de datos que se define como cero al inicio del programa. Antes de llamar a main() , se llaman inicializadores estáticos. Para x ese es el código x = x + 1 . x = 0 + 1 = 1 . Por lo tanto, el main () devolvería 1.

El código definitivamente funcionaría de manera impredecible si x es una variable local, asignada en la pila. El estado de pila, a diferencia del segmento de datos, está garantizado que contiene basura indefinida.

Tengo esta pregunta, que pensé antes, pero pensé que no es trivial responder

int x = x + 1; int main() { return x; }

Mi pregunta es si el comportamiento del programa está definido o no definido si es válido en absoluto. Si está definido, ¿se conoce el valor de x en main ?


Antes de que la llamada principal x se inicialice en 0, por lo tanto, su valor debe ser 1 en el que ingrese principal, y usted devolverá 1. Es un comportamiento definido.


Estoy bastante seguro de que está definido, y x debería tener el valor 1. §3.6.2 / 1 dice: "Los objetos con una duración de almacenamiento estática (3.7.1) se inicializarán en cero (8.5) antes de que se lleve a cabo cualquier otra inicialización. "

Después de eso, creo que todo es bastante sencillo.


La variable ''x'' está almacenada en .bss, que está llena de ceros cuando carga el programa. En consecuencia, el valor de ''x'' es 0 cuando el programa se carga en la memoria.

Luego, antes de llamar a main, se ejecuta "x = x + 1".

No sé si es válido o no, pero el comportamiento no está indefinido.