Pro du C requi : question sur les variables initalisées dans un for - C++ - Programmation
Marsh Posté le 04-02-2003 à 21:29:33
Le i du for n'a que la portée du for. Tu affiches donc le i qui a la portée de ton prog, cleui = à 3.
Marsh Posté le 04-02-2003 à 21:35:38
Non...le compilateur ne fait rien, il ne reinitialise rien du tout. Tes deux "i" sont 2 variables différentes...(dans des blocs de code différents).
Suis pas sûr d'être clair...
Code :
|
Marsh Posté le 04-02-2003 à 21:36:03
thenutskiller a écrit : Le i du for n'a que la portée du for. |
Oui, mais non. Ca aurait été le cas si le i avait été redéclaré dans l'initialisation du for. Ce n'est pas le cas, on réutilise la même variable, donc c'est normal qu'après la boucle, on récupère 6.
Marsh Posté le 04-02-2003 à 21:36:36
Willyzekid a écrit : Tes deux "i" sont 2 variables différentes...(dans des blocs de code différents). |
Il redéclare pas i
Marsh Posté le 04-02-2003 à 21:40:47
kadreg a écrit : |
aya...
Du coup, c'est le même i et il doit renvoyer 6 et pas 3 à la fin de la boucle.
Marsh Posté le 04-02-2003 à 21:41:54
donc si un redéclare avec int i dans le for, on obtiendra le i du for, et pas le i d'avant le for
corrolaire : si on met pas int i dans le for on retrouve la veleur de i avant le for
j'me perd, dite le si j'ai faux
Marsh Posté le 04-02-2003 à 21:42:07
ton code affiche bien 6 et pas 3.
si tu veux déclarer une autre variable i dans le premier statement du for (ce qui est possible en C99 (gcc -std=c99)), cette variable amsque le i du contexte supérieur
Marsh Posté le 04-02-2003 à 21:44:11
Je me suis fait complétement grillé sur ce topic quelque chose de sévère
Marsh Posté le 04-02-2003 à 21:45:05
++Taz a écrit : ton code affiche bien 6 et pas 3. |
std=c99 ça veux dire utilise le standard du C de 1999 ? me souviens d'une histoire comme ça aussi
donc en faite ce standard ne dit pas de remettre l'ancienne valeur, il dit de redéfinir le i du for
Marsh Posté le 04-02-2003 à 21:49:25
qu'est ce que tu nous fais chier avec tes variables avec le meme nom partout, on t'as déjà expliquer 20x le phénomène de masquage (-Wshadow), c'est pas une question de c99 ou d'autre chose, c'est la meme chose en ansi et en K&R
Marsh Posté le 04-02-2003 à 21:49:53
Non mais il dit rien le standard..ou plutôt il dit que si tu déclare une variable dans le for, elle a une porté locale au for.
Si tu ne la déclare pas, elle doit être déclaré avant et sa valeur change dans le for...
Marsh Posté le 04-02-2003 à 21:55:18
deadog a écrit : J'avais lu, ici |
Je m'attendais à ce qu'il renvoie 7
GCC 2.95.3-6 -> il renvoie bel et bien 7 !
Normal, puisuqe le i de la boucle for est le même que celui déclaré plus haut.
Les manip genre :
for (int i = 0; ...
c'est du C++. En C, on a pas le droit de déclarer des variables n'importe où.
Marsh Posté le 04-02-2003 à 21:59:47
ITM a écrit : |
permis par le C99 (partiellement dispos sur ta version de gcc)
Marsh Posté le 04-02-2003 à 22:02:46
donc j'ai tout faux
Marsh Posté le 04-02-2003 à 22:10:48
k
d'autant ke je suis pour le respect des normes ^^
si je récapitule
le standard C99 permet de redéfinir les variables initialisé dans un for, dans ce cas la seulement elles auront une valeur différentes d'une variables portant la même nomination dans le prog
mici pour ma culture générale
Marsh Posté le 04-02-2003 à 22:17:38
deadog a écrit : k |
t'a rien compris
en C99
for(int i=0; ; );
en C89
{int i; for(i=0; ; );}
Marsh Posté le 04-02-2003 à 22:21:35
++Taz a écrit : t'a rien compris |
on peux mettre ça en C99 ? :
int i;
for(int i=0 ; ; ; );
Marsh Posté le 04-02-2003 à 22:26:57
donc "le standard C99 permet de redéfinir les variables initialisé dans un for" c bon ??
et d'après
Citation : il dit que si tu déclare une variable dans le for, elle a une porté locale au for. |
et ce ki a était dit avant, alors "dans ce cas la seulement elles auront une valeur différentes d'une variables portant la même nomination dans le prog" c bon aussi, ou j'me gourre ?
Marsh Posté le 04-02-2003 à 22:29:29
on ne peut jamais redéfinir une variable. 2 varaibles peuvent avoir le meme nom si elles ont de sportées différentes, mais en aucun cas elles n'ont le mme adressage ou symbole. le nom n'a que peut d'importance dans toute cette histoire, c'est juste de la masturbation intellectuelle de newbie
Marsh Posté le 04-02-2003 à 22:33:47
kan je dit redéfinir j'entend utilisé un autre emplacement mémoire ke l'autre déjà définie
laisse moi deviner, c pas ça
Marsh Posté le 04-02-2003 à 22:36:01
oui, j'ai choisie un terme peu approprié, mais j'avais comprit comme j'ai expliké
donc ça serait plutôt un genre de "redéfinir localement au for"
Marsh Posté le 04-02-2003 à 22:38:18
mais non putain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Marsh Posté le 04-02-2003 à 22:41:27
agnah !
utiliser un autre emplacement mémoire ke l'autre déjà définie et k complétement indépendante du reste du prog, ké pas du tout pareil, ké dans son ptit monde
?
Marsh Posté le 04-02-2003 à 22:45:31
le nom "humain" (i, ma_variable) est enfait un alais pour le compilateur. meme si le nom humain est pareil, grace à la résolution de l'alias, il ne s'agit en aucun cas de la meme variable
Marsh Posté le 04-02-2003 à 22:50:16
oui ça je sais
le "i" du prog est différent du "i" du for lorsqu'on fait avec "int i"
le for est comme une fonction alors
Marsh Posté le 04-02-2003 à 22:52:57
oui et le for n'est pas comme une fonction. les fonctions n'ont rien a voir avec la portée des varaibles. enf ait c'est une historie de bloc {}, et comme le coprs d'une fonction a obligatoirement un bloc, ben....
tu peux tres bien ecrire
{
int i;
{
int i;
{
int i;
}
}
}
Marsh Posté le 04-02-2003 à 22:58:08
ah ? je savais pas ça
c pour ça ke j'avais pas comprit ton :
en C99
for(int i=0; ; );
en C89
{int i; for(i=0; ; );}
Marsh Posté le 04-02-2003 à 23:00:52
ben voilà. en fait la notation rapide (for déclaration ; est un raccourci d'ecriture en C99 et dans d'autres langages. en effet, il est conseiller de limiter la portée des variables au strict nécessaire: ça n'a aucun interet de conserver une variable i qui a servi pour iterer dans un for à partir du moment ou on n'a fini le for.
Marsh Posté le 04-02-2003 à 23:05:29
n'oublies l'option -Wshadow de gcc qui t'avertit de ces masquages (meme nom, mais portées différentes)
Marsh Posté le 04-02-2003 à 21:14:01
J'avais lu, ici même, y'a pas mal de temps, que les variables initialisées dans un for (cad celles avant le premier ; ) devait être réinitialisé à l'état quel avait avant.
Ct au compilo de faire ça
expl :
i=3;
for (i=0 ; i<=6 ; i++);
printf("%d\n", i); // Renvoie 3 et pas 6
spa la penne d'essayer de tester si c vrai ou pas, très peu de compilo le font, ou au moins le font systèmatiquement
est-ce donc vrai finallement ?
Message édité par Deadog le 04-02-2003 à 21:17:24