64 votes

Cette auto-initialisation est-elle valide?

J'ai cette question, à laquelle j'ai pensé plus tôt, mais j'ai pensé qu'il n'est pas trivial de répondre

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

Ma question est de savoir si le comportement du programme est défini ou non défini s'il est valide. Si elle est définie, la valeur de x connue en main ?

100voto

Jerry Coffin Points 237758

Je suis presque sûr que c'est défini et que x devrait avoir la valeur 1. Le paragraphe 3.6.2 / 1 dit: "Les objets ayant une durée de stockage statique (3.7.1) doivent être initialisés à zéro (8.5) avant toute autre initialisation. "

Après cela, je pense que tout est assez simple.

11voto

Dummy00001 Points 6088

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 d' main(), initialiseurs statiques sont appelés. Pour x , qui est le code x = x + 1. x = 0 + 1 = 1. Ainsi, le principal() renvoie 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.

6voto

Tomaka17 Points 2097

La variable 'x' est stockée dans le fichier .bss, qui est rempli de 0 lorsque vous chargez le programme. Par conséquent, la valeur de 'x' est 0 lorsque le programme est chargé en mémoire.

Ensuite, avant que main soit appelé, "x = x + 1" est exécuté.

Je ne sais pas si c'est valide ou non, mais le comportement n'est pas indéfini.

0voto

LostMohican Points 1069

Avant l'appel principal, x doit être initialisé à 0; sa valeur doit donc être 1, vous entrez main et vous renverrez 1. C'est un comportement défini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X