web-dev-qa-db-fra.com

Pour la boucle à l'intérieur de ses propres accolades

J'ai rencontré cette disposition pour la boucle:

#include <iostream>
int main()
{
    {
        for (int i = 0; i != 10; ++i)
        {
            std::cout << "delete i->second;" << std::endl;
        }
    }

    {
        for (size_t i = 0; i < 20; ++i)
        {
            std::cout << "delete m_indices[i];" << std::endl;
        }
    }
    return 0;
}

Je me demandais à quoi sert cette couche supplémentaire d'accolades? Cela apparaît quelques fois dans notre base de code.

117
Ed Norman

Il était une fois, il y a de nombreuses lunes, VS6 existait et était populaire. Il n'a cependant pas été conforme à un certain nombre de normes C++. ce qui était raisonnable à l'époque car il a été publié juste avant (la même année), la norme a été officiellement publiée; elle a toutefois été conforme au projet de norme, à ma connaissance.

L'une des normes qui a changé entre le projet et le standard officiel était la durée de vie des variables de boucle for créées dans la première section; conduisant à l'échec de la compilation du code suivant

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

parce que i a été redéfini par la seconde pour la boucle.

Alors que d'autres compilateurs ont également souffert de ce bug; Je souligne la version VS6 car elle est restée la seule version de visual studio pendant plusieurs années après la publication de la norme, mais n’a jamais publié de mise à jour pour ce problème particulier; ce qui signifie qu'il a eu un impact plus significatif.

Une solution consiste à forcer l'ensemble de la boucle for dans son propre champ d'application, comme vous l'avez montré.

287
UKMonkey

{ et } créeront une étendue et si vous définissez des variables dans l'étendue, vous ne pourrez pas y accéder de l'extérieur. Mais for crée déjà cette portée. Alors

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

est le même que

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

mais si vous définissez quelque chose entre eux, il y a une différence

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

Dans cet exemple, a ne sera pas accessible de l'extérieur.

15
cokceken

C'est un portée du bloc marqué par {} accolades. Il est généralement utilisé pour marquer la zone stockage automatique . Dans votre cas, il ne semble rien faire car la boucle pour la boucle a sa propre portée en C++ standard.

2
Ron

Dans votre exemple particulier, il n'y a aucune raison pour cela.

Parfois, vous voudrez peut-être créer une portée pour une variable:

float average;
// ...

{
int sum = 0;
for (int i = 0; i < count; ++i)
{
   sum += v[i];
}
average = (float)sum / count;
}

// use average
// sum not in scope here

Cependant, je vois cela comme un anti-modèle. Habituellement, si vous avez besoin de le faire, il est fort probable que la for devrait être sa propre fonction.

2
bolov