Esta auto-boot é válida?

Eu tenho essa pergunta, que eu pensei antes, mas percebi que não é trivial responder

int x = x + 1; int main() { return x; } 

Minha pergunta é se o comportamento do programa é definido ou indefinido se é válido. Se estiver definido, o valor de x conhecido no main ?

Tenho certeza 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 de qualquer outra boot ocorrer. ”

Depois disso, acho tudo muito simples.

Minha pergunta é se o comportamento do programa é definido ou indefinido se é válido. Se estiver definido, o valor de x é conhecido no main?

Este código definitivamente não está limpo, mas para mim deveria funcionar previsivelmente.

int x coloca a variável no segmento de dados que é definido como zero no início do programa. Antes de main() , os inicializadores estáticos são chamados. Para x esse é o código x = x + 1 . x = 0 + 1 = 1 . Assim, o main () retornaria 1.

O código definitivamente funcionaria de maneira imprevisível se x for uma variável local, alocada na pilha. O estado da pilha, ao contrário do segmento de dados, é praticamente garantido para conter lixo indefinido.

A variável ‘x’ armazenada no .bss, que é preenchida com 0s quando você carrega o programa. Consequentemente, o valor de ‘x’ é 0 quando o programa é carregado na memory.

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 para 0, portanto, seu valor deve ser 1 que você insira main e retornará 1. É um comportamento definido.