Esta autoinicialização é válida?
-
27-09-2020 - |
Pergunta
Eu tenho essa pergunta, na qual pensei antes, mas achei que não seria trivial responder
int x = x + 1;
int main() {
return x;
}
Minha pergunta é se o comportamento do programa está definido ou indefinido, se for válido.Se estiver definido, o valor de x
conhecido em main
?
Solução
Tenho certeza de que está definido e x deve ter o valor 1.§3.6.2/1 diz:"Objetos com duração de armazenamento estático (3.7.1) devem ser inicializados com zero (8.5) antes que qualquer outra inicialização ocorra."
Depois disso, acho que tudo é bastante simples.
Outras dicas
Minha pergunta é se o comportamento do programa está definido ou indefinido, se for válido.Se estiver definido, o valor de x é conhecido em main?
Definitivamente, esse código não está limpo, mas para mim deve funcionar de maneira previsível.
int x
coloca a variável no segmento de dados que é definido como zero no início do programa.Antes main()
, inicializadores estáticos são chamados.Para x
esse é o código x = x + 1
. x = 0 + 1 = 1
.Assim, main() retornaria 1.
O código definitivamente funcionaria de maneira imprevisível se x
é uma variável local, alocada na pilha.O estado da pilha, ao contrário do segmento de dados, é praticamente garantido que contém lixo indefinido.
A variável 'x' é armazenada no .bss, que é preenchido com 0s quando você carrega o programa.Conseqüentemente, o valor de 'x' é 0 quando o programa é carregado na memória.
Então, antes de main ser chamado, "x = x + 1" é executado.
Não sei se é válido ou não, mas o comportamento não é indefinido.
Antes da chamada principal, x deve ser inicializado com 0, portanto seu valor deve ser 1, você insere main e retornará 1.É um comportamento definido.