108 votes

Une boucle «for» à l'intérieur d'une boucle «for» peut-elle utiliser le même nom de variable de compteur?

Puis-je utiliser la même variable de compteur pour une boucle for à l'intérieur d'une boucle for ?

Ou les variables vont-elles s'influencer mutuellement? Le code suivant doit-il utiliser une variable différente pour la deuxième boucle, telle que j , ou i correct?

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

144voto

Eric Postpischil Points 36641

Vous pouvez utiliser le même nom (identificateur). Il sera un objet différent. Elles ne touchent pas les uns les autres. À l'intérieur de la boucle interne, il n'y a aucun moyen de se référer à l'objet utilisé dans la boucle externe (à moins de prendre des dispositions spéciales pour que, que par le biais d'un pointeur).

C'est généralement mauvais style, est sujette à confusion et devrait être évitée.

Les objets sont différents que si l'interne est défini séparément, comme avec l' int i vous avez montré. Si le même nom est utilisé sans définition d'un nouvel objet, les boucles, utilisez le même objet et interfèrent les unes avec les autres.

57voto

dasblinkenlight Points 264350

Tout d'abord, ce n'est absolument juridique: le code de compiler et d'exécuter, en répétant le corps de la boucle imbriquée 10×10=100 fois. Compteur de boucle, i à l'intérieur de la boucle imbriquée va cacher le compteur de la boucle externe, de sorte que les deux compteurs devrait être incrémenté indépendamment les uns des autres.

Depuis l'extérieur i est caché, le code à l'intérieur de la boucle imbriquée corps n'auront accès qu'à la valeur de i de la boucle imbriquée, pas i de la boucle externe. Dans les situations où la boucle imbriquée n'a pas besoin d'un accès à l'extérieur i ce code peut être parfaitement justifié. Cependant, cela est susceptible de créer plus de confusion dans ses lecteurs, donc c'est une bonne idée pour éviter d'écrire du code pour éviter les "obligations alimentaires."

Remarque: Même si les variables compteur de deux boucles ont le même identificateur i, ils restent à deux variables indépendantes, c'est à dire que vous êtes pas en utilisant la même variable dans les deux boucles. En utilisant la même variable dans les deux boucles est également possible, mais le code est difficile à lire. Voici un exemple:

for (int i = 1 ; i < 100 ; i++) {
    for ( ; i % 10 != 0 ; i++) {
        printf("%02d ", i);
    }
    printf("%d\n", i);
}

Maintenant, les deux boucles d'utiliser la même variable. Cependant, il faut un certain temps à comprendre ce que ce code n'sans le compiler (démonstration);

26voto

OmG Points 7536

Vous pouvez. Mais vous devez être conscient de la portée du i s. si nous appelons le i extérieur avec i_1 et le i intérieur avec i_2 , la portée du i s est le suivant:

 for(int i = 0; i < 10; i++)
{
     // i means i_1
     for(int i = 0; i < 10; i++)
     {
        // i means i_2
     }
     // i means i_1
}
 

Vous devez noter qu'ils ne s'influencent pas mutuellement et que leur champ de définition est différent.

17voto

Dodo Points 218

C'est tout à fait possible, mais gardez à l'esprit, vous ne serez pas en mesure d'adresse le premier a déclaré j'

for(int i = 0; i < 10; i++)//I MEAN THE ONE HERE
{

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

    }
}

dans la deuxième boucle dans le deuxième enfant de la boucle

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

  for(int i = 0; i < 10; i++)//the new i
    {
        // i cant see the i thats before this new i here
    }
}

si vous avez besoin d'ajuster ou d'obtenir la valeur de la première que j'ai, utilisation de j dans la deuxième boucle

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

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

    }
}

et si votre créatif assez vous pouvez faire les deux d'entre eux dans une boucle

for(int i ,j= 0; i < 10; (j>9) ? (i++,j=0) : 0 ,j++)
{
    printf("%d %d\n",i,j);
}

13voto

H.S. Points 5974

Oui, vous pouvez utiliser la même variable de compteur de nom pour un intérieur for boucle comme pour l'extérieur for boucle.

À partir de la boucle:

for ( init_clause ; cond_expression ; iteration_expression ) loop_statement
L'expression de déclaration utilisé comme loop_statement établit son propre bloc de portée, distincte de la portée de init_clause.

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}  

Le champ d'application de loop_statement est imbriquée dans le champ d'application de init_clause.

À Partir De Normes C#6.8.5p5 Itération états [c'est moi qui souligne]

Une itération déclaration est un bloc dont la portée est un sous-ensemble strict de la portée de son bloc enfermant. Le corps de la boucle est également un bloc dont la portée est un sous-ensemble strict de la portée de l'itération déclaration.

À Partir De Normes C#6.2.1p4 portée des identificateurs [c'est moi qui souligne]

....Dans l'intérieur de la portée, de l'identifiant désigne l'entité déclarée à l'intérieur de l'étendue; l' entité déclarée à l'extérieur de la portée est caché (et non visible) dans l'intérieur de la portée.

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