31 votes

Redéclaration C ++ du comportement incohérent des variables de nombre de boucles?

Je fais du C++ dans Visual Studio 2010 et a trouvé quelques comportements bizarres. Pour rendre une longue histoire courte, j'ai trouvé que cela ne compile pas:

for (int i = 0; i < 10; i++)
{
    int i = 11;
}

Cela semble correct, puisque la variable i est déjà déclarée dans la boucle for en-tête.

Maintenant, cependant, si j'insère une autre pour la boucle avant de la re-déclaration de i, puis, soudain, le compilateur, intellisense etc thiks le code est correct - sans donner de réelles mises en garde (Essayé les avertissements de niveau 3 et quatre (/W3 et /w4)). Donc, en faisant ce sera fait, de compiler et d'exécuter:

for (int i = 0; i < 10; i++)
{
    for(int j = 0; j < 5; j++)
    {
    }

    int i = 11;
}

Personnellement, je trouve bizarre que insering un autre pour la boucle de légitimer le contraire même code scénario. Toute sorte d'esprit capable de me dire ce que je suis surplombant ici?

Merci à l'avance!

EDIT: Wow, merci à tous pour toutes les réponses et démos - Vous êtes génial! :) Cet échantillon d'exposer un bug n'a traverser mon esprit, j'ai supposé que MS aurait remarqué une telle chose maintenant, et il fixe...au moins dans VS2013.

Essayé de changer les paramètres d'optimisation, comme l'a suggéré, mais il ne faisait aucune différence.

Merci tout le monde!

Premier morceau de code

Deuxième morceau de code

De crédit pour faire des démos: @Mark Garcia

19voto

M M. Points 29201

Selon la spécification de la norme:

1 ... des noms déclarés dans l'initialisation de l'instruction sont dans le même déclarative-région que ceux déclarés dans l'état

3 Si le pour-init-déclaration est une déclaration de la portée du nom de(s) a déclaré s'étend jusqu'à la fin de l'instruction. [§6.5.3]

et

4 Des noms déclarés dans l'initialisation de l'instruction, la portée de la déclaration, et à la condition d'un if, while, for, et les instructions switch locaux pour le if, while, for, ou instruction switch (y compris la déclaration contrôlée), et ne doit pas être redéclarée dans un état ultérieur de cette déclaration, ni à l'extérieur du bloc (ou, pour l'instruction si, tout de ultrapériphériques blocs) de la déclaration contrôlée [§3.3.3]

Le comportement de MSVC++2010 n'est pas standard et c'est un bug.

0voto

Pandrei Points 1751

quand vous faites quelque chose comme:

 for (int i = 0; i < 10; i++)
    {
     //some code
    }

vous êtes déclarant la variable i et la restriction de son champ d'application pour le pour le bloc de code. Donc, il va seulement être visible à l'intérieur de la boucle for. Avec cela à l'esprit, votre premier extrait de code redéfinit la variable i;

for (int i = 0; i < 10; i++)
 {
      int i;
 }

le compilateur se plaint d'une redéfinition parce que vous avez maintenant 2 variables avec le même nom, le même type de données et la même portée.

Aussi loin que pourquoi le deuxième morceau de code compile -compilateur bug. Elle dépend uniquement sur le compilateur de mise en œuvre; si vous modifiez le niveau d'optimisation, il pourrait ne pas se montrer plus.

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