programacion - modo c99 c
¿Por qué este código C compila? (5)
Es un comportamiento indefinido usar un valor no inicializado (§C99 J.2 "El valor de un objeto con duración de almacenamiento automático se usa cuando es indeterminado"). Así que cualquier cosa puede pasar desde los demonios nasales hasta c = 0, hasta jugar a Nethack .
#include <stdio.h>
int main() {
int c = c;
printf("c is %i/n", c);
return 0;
}
Estoy definiendo una variable entera llamada c
, y estoy asignando su valor a sí misma. Pero, ¿cómo puede esto incluso compilar? c
no se ha inicializado, entonces, ¿cómo puede asignarse su valor a sí mismo? Cuando ejecuto el programa, obtengo c is 0
.
Estoy asumiendo que el compilador está generando un código de ensamblaje que está asignando espacio para la variable c
(cuando el compilador encuentra la declaración int c
). Luego toma el valor no deseado de ese espacio no inicializado y lo asigna de nuevo a c
. ¿Esto es lo que está pasando?
La especificación de C no garantiza que las variables se inicialicen a 0, 0.0 ni "" o ''''.
Esa es una característica de los compiladores y nunca debes empujar eso sucederá.
Siempre configuro mi IDE / Compilador para advertir sobre eso.
Recuerdo haberlo citado en una respuesta anterior, pero no lo encuentro por el momento.
C ++ 03 §3.3.1 / 1:
El punto de declaración para un nombre es inmediatamente después de su declarador completo (cláusula 8) y antes de su inicializador (si existe), ...
Por lo tanto, la variable c es utilizable incluso antes de la parte inicializadora.
Edit: Lo siento, usted preguntó acerca de C específicamente; aunque estoy seguro de que hay una línea equivalente allí. James McNellis lo encontró:
C99 §6.2.1 / 7: cualquier identificador que no sea una estructura, unión o etiqueta de enumeración "tiene un alcance que comienza justo después de completar su declarador". Al declarador le sigue el inicializador.
Tu conjetura es exactamente correcta int c
coloca espacio en la pila para la variable, que luego se lee y se vuelve a escribir para la parte c = c
(aunque el compilador puede optimizar eso). Su compilador está presionando el valor como 0
, pero esto no garantiza que siempre sea así.
c ha sido inicializado!
Aunque esta es una línea de código, en realidad está inicializando c primero, y luego asignándole c. Tienes suerte de que el compilador esté inicializando c a cero para ti.