Ya sea en C o C ++, creo que este programa ilegal, cuyo comportamiento según el estándar C o C ++ no está definido, es interesante:
#include <stdio.h>
int foo() {
int a;
const int b = a;
a = 555;
return b;
}
void bar() {
int x = 123;
int y = 456;
}
int main() {
bar();
const int n1 = foo();
const int n2 = foo();
const int n3 = foo();
printf("%d %d %d\n", n1, n2, n3);
return 0;
}
Salida en mi máquina (después de la compilación sin optimización):
123 555 555
Creo que este programa ilegal es interesante porque ilustra la mecánica de la pila, porque la razón por la que uno usa C o C ++ (en lugar de, por ejemplo, Java) es para programar cerca del hardware, cerca de la mecánica de la pila y similares.
Sin embargo, en StackOverflow, cuando el código de un interlocutor lee inadvertidamente desde el almacenamiento no inicializado, las respuestas con mayor número de votos siempre citan el estándar C o C ++ (especialmente C ++) en el sentido de que el comportamiento no está definido. Esto es cierto, por supuesto, en lo que respecta al estándar, el comportamiento es indefinido, pero es curioso que las respuestas alternativas intenten, desde una perspectiva de hardware o mecánica de pila, investigar por qué un comportamiento indefinido específico (como el salida anterior) podría haber ocurrido, son raros y tienden a ser ignorados.
Incluso recuerdo una respuesta que sugería que un comportamiento indefinido podría incluir reformatear mi disco duro. Sin embargo, no me preocupé demasiado por eso antes de ejecutar el programa anterior.
Mi pregunta es esta: ¿Por qué es más importante enseñar a los lectores simplemente que el comportamiento no está definido en C o C ++, que comprender el comportamiento indefinido? Quiero decir, si el lector entendiera el comportamiento indefinido, ¿no sería más probable que lo evite?
Resulta que mi educación es en ingeniería eléctrica, y trabajo como ingeniero de construcción de edificios, y la última vez que tuve un trabajo como programador en sí fue en 1994, por lo que tengo curiosidad por comprender la perspectiva de los usuarios con más convencional, más antecedentes recientes de desarrollo de software.