Est-ce de l'auto initialisation valide?
-
27-09-2020 - |
Question
J'ai cette question, à laquelle j'ai pensé plus tôt, mais pensé qu'il n'est pas trivial pour répondre
int x = x + 1;
int main() {
return x;
}
Ma question est de savoir si le comportement du programme est défini ou indéfini si c'est valable à tous.Si elle est définie, est la valeur de x
connu dans main
?
La solution
Je suis sûr que c'est défini, et x doit avoir la valeur 1.§3.6.2/1 dit:"Les objets statiques durée de stockage (3.7.1) doit être initialisé à zéro (8.5) avant toute autre initialisation a lieu."
Après, je pense que c'est tout assez simple.
Autres conseils
Ma question est de savoir si le comportement du programme est défini ou indéfini si c'est valable à tous.Si elle est définie, est la valeur de x est connue dans la main?
Ce code n'est certainement pas propre, mais pour moi, il devrait fonctionner de manière prévisible.
int x
met la variable dans le segment de données est définie à zéro au début du programme.Avant main()
, initialiseurs statiques sont appelés.Pour x
qui est le code x = x + 1
. x = 0 + 1 = 1
.Ainsi, le main() serait de retour 1.
Le code serait certainement travailler de manière imprévisible si x
est une variable locale, alloué sur la pile.État de la pile, à la différence du segment de données, est à peu près garanti pour contenir undefined ordures.
Le 'x' dans la variable stockée dans le .sev, qui est rempli avec des 0 lorsque vous chargez le programme.Par conséquent, la valeur de 'x' est de 0 lorsque le programme est chargé en mémoire.
Alors avant d'principal est appelé, "x = x + 1" est exécuté.
Je ne sais pas si c'est valable ou pas, mais le comportement n'est pas défini.
Avant l'appel principal x doit être initialisé à 0 par conséquent, sa valeur doit être 1 un vous entrez principal, et vous renverra 1.C'est un comportement défini.