Puis-je utiliser la même variable de compteur pour une for
boucle à l'intérieur d'une for
boucle?
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 est-ce i
bien?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
i
, avec des portées différentes. À utiliser-Wshadow
avec GCC pour signaler automatiquement ces problèmes.-Wshadow
ne soit pas inclus dans-Wall
.-Wshadow
met également en garde contre l'observation des variables globales, ce qui pourrait facilement devenir ennuyeux dans les projets plus importants.-Wextra
ne comprend même pas-Wshadow
. Je suppose que c'est assez courant dans certains projets, ou que certains développeurs gcc aiment l'observation en tant que style de codage, pour justifier d'être laissé de côté comme ça.-Wshadow
a un taux de faux positifs horrible, le rendant complètement inutile. La portée existe pour une raison, et l'observation n'est a priori pas problématique. Maintenant-Wshadow-local
(note: non-Wshadow=local
) est très différent. Mais malheureusement, GCC a jusqu'à présent refusé de l'inclure dans le coffre (bien qu'il semble y avoir des fourchettes de GCC qui l'incluent).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, comme en lui fournissant un pointeur).
C'est généralement un mauvais style, est sujet à confusion et doit être évité.
Les objets ne sont différents que si l'intérieur est défini séparément, comme avec le que
int i
vous avez montré. Si le même nom est utilisé sans définir un nouvel objet, les boucles utiliseront le même objet et interféreront les unes avec les autres.la source
Tout d'abord, c'est absolument légal: le code se compilera et s'exécutera en répétant le corps de la boucle imbriquée 10 × 10 = 100 fois. Le compteur de boucle
i
à l'intérieur de la boucle imbriquée masquera le compteur de la boucle externe, de sorte que les deux compteurs seraient incrémentés indépendamment l'un de l'autre.Étant donné que l'extérieur
i
est masqué, le code à l'intérieur du corps de la boucle imbriquée aurait accès uniquement à la valeur dei
de la boucle imbriquée, pas ài
partir de la boucle externe. Dans les situations où la boucle imbriquée n'a pas besoin d'accéder aui
code externe, un tel code pourrait être parfaitement justifiable. Cependant, cela est susceptible de créer plus de confusion chez ses lecteurs, c'est donc une bonne idée d'éviter d'écrire un tel code pour éviter les «responsabilités de maintenance».Remarque: même si les variables de compteur des deux boucles ont le même identifiant
i
, elles restent deux variables indépendantes, c'est-à-dire que vous n'utilisez pas 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:Les deux boucles utilisent maintenant la même variable. Cependant, il faut un certain temps pour comprendre ce que fait ce code sans le compiler ( démo );
la source
int
sur la boucle for interne, c'est-à-dire utiliser en fait la même variable de compteur, fera que la boucle externe ne s'exécutera qu'une seule fois, car la boucle interne partirai == 10
. C'est trivial, mais je pense que cela apporte des éclaircissements compte tenu de la façon dont la question a été poséeVous pouvez. Mais vous devez être conscient de la portée de l'
i
art. si nous appelons l'extérieuri
aveci_1
et l'intérieuri
aveci_2
, la portée dui
s est la suivante:Vous devriez remarquer qu'ils ne s'affectent pas et que leur champ de définition est différent.
la source
C'est tout à fait possible, mais gardez à l'esprit que vous ne pourrez pas traiter le premier i déclaré
dans la deuxième boucle dans la deuxième boucle enfant
si vous avez besoin d'ajuster ou d'obtenir la valeur du premier i, utilisez j dans la deuxième boucle
et si votre créativité est suffisante, vous pouvez faire les deux en une seule boucle
la source
Oui, vous pouvez utiliser le même nom de variable de compteur pour une
for
boucle interne que pour lafor
boucle externe .Depuis la boucle for :
La portée de loop_statement est imbriquée dans la portée de init_clause .
From C Standards # 6.8.5p5 Instructions d'itération [c'est moi qui souligne]
De C Standards # 6.2.1p4 Portées des identificateurs [c'est moi qui souligne]
la source
Du point de vue du code / compilateur, ce serait une chose parfaitement valide et légale à faire. Le
int i
déclaré dans lafor(int i = 0; i < 10; i++)
boucle interne est dans une portée nouvelle et plus petite, de sorte que la déclaration occulte la déclaration deint i
dans la boucle externe (ou, en d'autres termes: dans la portée interne, tous les accès à la variablei
vont à laint i
déclaration dans la portée interne, laissant leint i
dans le champ extérieur intact).Cela dit, du point de vue de la qualité du code, c'est absolument horrible. C'est difficile à lire, difficile à comprendre et facile à mal comprendre. Ne fais pas ça.
la source
Oui, vous pouvez l'utiliser mais c'est assez déroutant. La chose la plus importante est la portée de la variable locale à l'intérieur de la boucle. Dans la mesure où une variable est déclarée à l'intérieur d'une fonction, la portée de cette variable est cette fonction.
De même, le cas des boucles, la variable déclarée à l'intérieur de la boucle interne a une portée différente et la variable déclarée la boucle externe a une portée différente.
La meilleure approche consiste à utiliser différentes variables pour les boucles internes et externes.
la source
Oui, vous pouvez certainement utiliser la même variable de nom.
Les variables de programmation C peuvent être déclarées à trois endroits:
les variables locales: -À l'intérieur d'une fonction ou d'un bloc.
Variables globales: -Out de toutes les fonctions.
Paramètres formels: -Dans les paramètres de fonction.
Mais dans votre cas, vous
i scope
devrez vous soucier des choses ci-dessousRemarque: il serait préférable d'utiliser des variables différentes pour les boucles internes et externes
la source
Oui - et encore plus intéressant, vous pouvez réutiliser un nom de variable chaque fois que vous ouvrez un ensemble d'accolades. Ceci est souvent pratique lors de l'insertion d'un code de diagnostic. Tapez une accolade ouverte '{' suivie de la déclaration et de l'utilisation de variables, puis fermez l'accolade et les variables disparaissent. Cela garantit que vous n'interférerez avec rien dans le corps principal tout en conservant l'avantage de toutes les variables, classes et méthodes déclarées en dehors des accolades.
la source
Règle de portée: une variable déclarée dans une instruction for ne peut être utilisée que dans cette instruction et dans le corps de la boucle.
Si dans votre code vous avez défini plusieurs instances de i dans des boucles internes, chaque instance occupera son propre espace mémoire. Il n'y a donc pas à s'inquiéter des résultats de toute façon, ce serait pareil.
Mais il n'est pas recommandé d'utiliser le même nom de variable car il est difficile à comprendre et il devient du code non maintenable plus tard.
la source
La partie importante est que le paramètre de boucle interne contient
int i
. Parce qu'ili
est redéfini de cette façon, les deux variables ne s'affectent pas; leurs portées sont différentes. Voici deux exemples pour illustrer cela:Notez que le code ci-dessus inclut
int i
dans le paramètre de boucle interne et que le code ci-dessous inclut uniquementi
.la source
Eh bien, vous pouvez le faire sans que vos scripts aient un problème, mais vous devez éviter cette structure. Cela conduit généralement à la confusion
la source