Je sais qu'il y a beaucoup de réponses, mais aucune d'entre elles n'a dissipé mon doute ... La norme C ++ dit:
La déclaration
forfor(int i=0; i<10; i++){ int num = 2; }est équivalent à
for(int i = 0; i < 5; i++){ int number = 2; // this will be executed in each iteration }sauf que les noms déclarés dans l' instruction init sont dans la même région déclarative que ceux déclarés dans la condition (qui est également la portée de l'instruction).
Cela signifie que si je déclare une variable à l'intérieur de l' instruction init , alors cette variable sera dans la même portée que celle de l' instruction et que l' instruction s'exécute à chaque itération ... maintenant, ma question est:
par exemple:
{
init-statement
while ( condition ) {
statement
expression ;
}
}
Maintenant, comme le dit la norme, la variable «i» sera également dans la même portée que «nombre», alors est-elle également détruite et déclarée à chaque itération comme «nombre»?
PS: mais ça ne peut pas être parce que les standards disent aussi que l'instruction init exécute une et une seule fois avant l'instruction condition .. Je veux juste savoir la raison et comment les choses fonctionnent?
ÉDITÉ
for ( init-statement condition ; expression ) statement
acc. aux normes La variable 'i' et la variable 'num' sont toutes deux dans la même portée, comment la variable 'i' est déclarée une seule fois et la variable num déclarée à plusieurs reprises (ici 10 fois), je veux dire si elles sont toutes les deux dans la même scope n'est pas la variable 'i' trop détruite et déclarée 10 fois comme 'num' ... (je sais que cela peut paraître idiot mais cela me déroute beaucoup)
3 Réponses :
Comme le dit la norme, i serai dans la même portée que le number , mais si vous regardez le code fourni par la norme, i ne serai initialisé qu'une seule fois. number , en revanche, sera initialisé à chaque itération.
Voir l'équivalent while boucle while. La variable déclarée dans l'initiateur survit à toutes les instances de variables à l'intérieur de la boucle. Mais une fois la boucle for terminée, la variable initiale sort de la portée et meurt (est détruite). Une chose à noter est que if peut également définir des variables dans la partie condition:
while(bool x=foo()) /*...*/;
et une règle similaire s'applique; Vous obtiendrez une portée implicite autour de l'instruction if / while . Mais il y a une différence entre while et for . Contrairement à for , l'objet initié dans une condition while :
if(bool x=foo()) /*...*/; if(int x=bar(); x>3) /*...*/;
est en fait limité à l'intérieur de la boucle et est détruit / construit par itération
Attention au terme portée . En gros, Scope est n'importe quelle paire d'accolades ( {} ) qui forme une instruction de bloc. Mais il y a aussi des portées implicites - tout comme celles autour de for / while / if . Toute étendue qui est sortie, tue ses objets imbriqués.
salutations, FM.
L'exception est principalement de souligner que
{
int i = 0;
while (i != 42) {
int i = 3; // "Ok", hide outer i
++i; // actually modify inner i
}
}
tandis que
for (int i = 0; i != 42; ++i)
{
int i = 3; // error: redeclaration of i
}
Cela n'affecte pas la durée de vie de la variable ou le lieu d'initialisation.
mais l'exception dit que la variable déclarée dans l'instruction init et la variable déclarée dans l'instruction loop se trouvent dans la même portée ... mais le code équivalent (tandis que la boucle que le compilateur génère, je pense) a deux portées différentes (une portée de parenthèse externe et une portée entre crochets intérieurs) de 2 variables 'i' ... mais la norme dit qu'elles ont toutes les deux la même portée (c'est pourquoi nous ne pouvons pas déclarer une autre variable du même nom dans l'instruction de boucle)
J'ai édité ma question (ajouté le dernier paragraphe) pouvez-vous clarifier mon doute s'il vous plaît ..
C'est une exception selon la portée normale, ils agissent qu'ils sont dans une portée différente (pour la durée de vie / création), ils agissent comme la même portée sur la dénomination.
vous voulez dire que le code dans le dernier para générera cette boucle while ... { while(condition){ int i=0; int num = 2; // comme i devrait être dans la même portée que celle de num. } } `
Pourquoi pensez-vous que 2 variables étant dans la même région déclarative affectent quand elles sont initialisées?
Notez que l'exception fait référence à l'endroit où les noms sont déclarés et non à l'endroit où les objets sont créés ou détruits.
@molbdnilo mais généralement là où le nom est déclaré, l'objet est créé au même endroit ... n'est-ce pas?
L'exception signifie que la portée des noms déclarés (qui ne sont pas des variables nécessaires) sont à l'intérieur de la boucle, mais toute variable déclarée a une durée de vie comme si elle était déclarée dans une portée distincte (les accolades externes) en dehors de celle-ci. (Les noms ont une portée, les objets ont une durée de vie.)