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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top