Question 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 un for boucle à l'intérieur d'un for boucle?

Ou les variables seront-elles mutuellement affectées? Le code suivant devrait-il utiliser une variable différente pour la seconde boucle, telle que jou est i bien?

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

67
2017-07-26 23:56


origine


Réponses:


Vous pouvez utiliser le même nom (identifiant). Ce sera un objet différent. Ils ne s’affecteront pas. À l'intérieur de la boucle interne, il n'y a aucun moyen de faire référence à l'objet utilisé dans la boucle externe (à moins que vous ne preniez des dispositions spéciales pour cela, en lui fournissant un pointeur).

Ceci est généralement un mauvais style, est sujet à la confusion et devrait être évité.

Les objets ne sont différents que si l’intérieur est défini séparément, comme avec le int i vous avez montré Si le même nom est utilisé sans définir de nouvel objet, les boucles utiliseront le même objet et interféreront les unes avec les autres.


113
2017-07-26 23:59



Tout d'abord, ceci est absolument légal: le code va compiler et exécuter, en répétant le corps de la boucle imbriquée 10 × 10 = 100 fois. Compteur de boucles i à l'intérieur de la boucle imbriquée sera cacher le compteur de la boucle externe, donc les deux compteurs seraient incrémentés indépendamment les uns des autres.

Depuis l'extérieur i est caché, le code à l'intérieur du corps de la boucle imbriquée n'aurait accès qu'à la valeur de i de la boucle imbriquée, pas i de la boucle extérieure. Dans les situations où la boucle imbriquée n'a pas besoin d'accéder à l'extérieur i un tel code pourrait être parfaitement justifiable. Cependant, cela risque de créer plus de confusion chez ses lecteurs. Il est donc préférable d'éviter d'écrire un tel code pour éviter les «obligations de maintenance».

Remarque: Même si les variables de compteur des deux boucles ont le même identifiant i, ils restent deux variables indépendantes, à savoir que vous êtes ne pas en utilisant la même variable dans les deux boucles. L'utilisation de la même variable dans les deux boucles est également possible, mais le code serait 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 utilisent la même variable. Cependant, il faut un certain temps pour comprendre ce que fait ce code sans le compiler (démo);


50
2017-07-26 23:59



Vous pouvez. Mais vous devez être conscient de la portée de la is. si nous appelons l'extérieur i avec i_1 et l'intérieur i avec i_2, la portée de la is est comme suit:

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 devriez remarquer qu'ils ne s’affectent pas et que leur définition est différente.


20
2017-07-27 00:03



C’est tout à fait possible mais gardez à l’esprit que vous ne pourrez pas   le premier a déclaré i

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

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

    }
}

dans la seconde boucle dans la seconde boucle enfant

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 devez ajuster ou obtenir la valeur du premier i, utilisez j dans la seconde boucle

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

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

    }
}

et si votre créativité est suffisante, vous pouvez faire les deux en une seule boucle

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

13
2017-07-27 00:29



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

De pour la boucle:

for ( init_clause ; cond_expression ; iteration_expression ) loop_statement
  La déclaration d'expression utilisée comme loop_statement établit son propre étendue du bloc, distincte du champ d'application de init_clause.

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

La portée de loop_statement est imbriqué dans le cadre de init_clause.

From C Standards # 6.8.5p5 Énoncés d'itération [emphase la mienne]

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

From C Standards # 6.2.1p4 Périmètre des identificateurs [emphase la mienne]

.... Dans le cadre interne, l'identifiant désigne l'entité déclarée dans le périmètre interne; la l'entité déclarée dans la portée externe est masquée (et non visible) dans la portée interne.


10
2017-07-27 00:48



Du point de vue du code / du compilateur, cela serait parfaitement valable et légal. le int i déclaré dans l'intérieur for(int i = 0; i < 10; i++) boucle est dans une nouvelle et plus petite portée, de sorte que la déclaration ombres la déclaration de int i dans la boucle externe (ou, avec d'autres mots: dans la portée interne tous les accès à la variable i aller à la int i déclaré dans la portée interne, laissant la int i dans la portée extérieure intacte).

Cela dit, du point de vue de la qualité du code, c'est absolument horrible. Il est difficile à lire, difficile à comprendre et à comprendre. Ne le fais pas


7
2017-07-27 07:18



Oui, vous pouvez certainement utiliser la même variable de nom.

Les variables de programmation C peuvent être déclarées à trois endroits:
 variables locales: -Intérieur d'une fonction ou d'un bloc.
 Variables globales: -Out de toutes les fonctions.
Paramètres formels: -Dans les paramètres de la fonction.

Mais dans ton cas i scope devra faire face aux choses ci-dessous

for(int i = 0; i < 10; i++)
{
     // i means 1st for loop variable
     for(int i = 0; i < 10; i++)
     {
        // but here i means 2nd for loop  variable
     }
     //interesting thing here i means 1st for loop variable
}

Remarque: il est recommandé d’utiliser différentes variables pour les boucles internes et externes.


6
2017-07-27 00:08