Seja em C ou C ++, acho que esse programa ilegal, cujo comportamento de acordo com o padrão C ou C ++ é indefinido, é interessante:
#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;
}
Saída na minha máquina (após compilação sem otimização):
123 555 555
Eu acho que esse programa ilegal é interessante porque ilustra a mecânica de empilhamento, porque o motivo pelo qual se usa C ou C ++ (em vez de, digamos, Java) é programar próximo ao hardware, próximo à mecânica de empilhamento e similares.
No entanto, no StackOverflow, quando o código de um interlocutor lê inadvertidamente a partir de armazenamento não inicializado, as respostas mais fortemente votadas invariavelmente citam o padrão C ou C ++ (especialmente C ++) para o efeito de que o comportamento é indefinido. Isso é verdade, é claro, no que diz respeito ao padrão - o comportamento é realmente indefinido - mas é curioso que respostas alternativas tentem, do ponto de vista do hardware ou da mecânica da pilha, investigar por que um comportamento indefinido específico (como o saída acima) pode ter ocorrido, é raro e tende a ser ignorado.
Até me lembro de uma resposta que sugeria que um comportamento indefinido poderia incluir a reformatação do meu disco rígido. Não me preocupei muito com isso antes de executar o programa acima.
Minha pergunta é a seguinte: por que é mais importante ensinar aos leitores apenas que o comportamento é indefinido em C ou C ++, do que entender o comportamento indefinido? Quero dizer, se o leitor entendeu o comportamento indefinido, ele não teria mais chances de evitá-lo?
Minha formação acontece em engenharia elétrica, e trabalho como engenheiro de construção civil, e a última vez em que trabalhei como programador em si foi em 1994, por isso estou curioso para entender a perspectiva dos usuários de maneiras mais convencionais e mais convencionais. históricos recentes de desenvolvimento de software.