Pregunta

Tengo esta pregunta, en la que pensé antes, pero pensé que no es trivial responderla.

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

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

¿Fue útil?

Solución

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

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

Otros consejos

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

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

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

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

La variable 'x' está almacenada en el .bss, que se completa con 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.

Antes de la llamada principal, x debe inicializarse en 0, por lo tanto, su valor debe ser 1. Si ingresa principal, devolverá 1.Es un comportamiento definido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top