Pro du C requi : question sur les variables initalisées dans un for

Pro du C requi : question sur les variables initalisées dans un for - C++ - Programmation

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 [:spamafote]
 
 
est-ce donc vrai finallement ? :??:


Message édité par Deadog le 04-02-2003 à 21:17:24
Reply

Marsh Posté le 04-02-2003 à 21:14:01   

Reply

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.

Reply

Marsh Posté le 04-02-2003 à 21:34:08    

donc c vrai, c ça ? :)

Reply

Marsh Posté le 04-02-2003 à 21:35:17    

Oui, je pense...

Reply

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 :
  1. 3 If  the  for-init-statement is a declaration, the scope of the name(s)
  2.   declared extends to the end of the for-statement.  [Example:
  3.           int i = 42;
  4.           int a[10];
  5.           for (int i = 0; i < 10; i++)
  6.                   a[i] = i;
  7.           int j = i;        // j = 42
  8.    --end example]


Message édité par Willyzekid le 04-02-2003 à 21:36:45

---------------
Horizon pas Net, reste à la buvette!!
Reply

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.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

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).
Suis pas sûr d'être clair...


 
[:tapai] Il redéclare pas i ;)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 04-02-2003 à 21:40:47    

kadreg a écrit :


 
[:tapai] Il redéclare pas i ;)


aya...
 
Du coup, c'est le même i et il doit renvoyer 6 et pas 3 à la fin de la boucle.


---------------
Horizon pas Net, reste à la buvette!!
Reply

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 http://forum.hardware.fr/icones/icon15.gif

Reply

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

Reply

Marsh Posté le 04-02-2003 à 21:42:07   

Reply

Marsh Posté le 04-02-2003 à 21:42:48    

arf, non, c l'inverse :pt1cable:

Reply

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 :D


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 04-02-2003 à 21:45:05    

++Taz a écrit :

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


 
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


Message édité par Deadog le 04-02-2003 à 21:45:35
Reply

Marsh Posté le 04-02-2003 à 21:49:25    

:heink:  
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

Reply

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...


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 04-02-2003 à 21:55:18    

deadog a écrit :

J'avais lu, ici  
int i=3;
for (i=0 ; i<=6 ; i++);  
printf("%d\n", i); // Renvoie 3 et pas 6
est-ce donc vrai finallement ? :??:


 
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ù.


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 04-02-2003 à 21:59:47    

ITM a écrit :


c'est du C++. En C, on a pas le droit de déclarer des variables n'importe où.

permis par le C99 (partiellement dispos sur ta version de gcc)

Reply

Marsh Posté le 04-02-2003 à 22:02:46    

donc j'ai tout faux :/ :D


Message édité par Deadog le 04-02-2003 à 22:03:27
Reply

Marsh Posté le 04-02-2003 à 22:05:52    

on ne badine pas avec le C :whistle:  :sol:

Reply

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 :D :jap:


Message édité par Deadog le 04-02-2003 à 22:12:00
Reply

Marsh Posté le 04-02-2003 à 22:17:38    

deadog a écrit :

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 :D :jap:

t'a rien compris
 
en C99
for(int i=0; ; );
 
en C89
{int i; for(i=0; ; );}

Reply

Marsh Posté le 04-02-2003 à 22:21:35    

++Taz a écrit :

t'a rien compris
 
en C99
for(int i=0; ; );
 
en C89
{int i; for(i=0; ; );}


 
http://forum.hardware.fr/icones/icon15.gif
 
on peux mettre ça en C99 ? :
int i;
for(int i=0 ; ; ; );


Message édité par Deadog le 04-02-2003 à 22:22:17
Reply

Marsh Posté le 04-02-2003 à 22:23:25    

oui

Reply

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 ?

Reply

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  :D

Reply

Marsh Posté le 04-02-2003 à 22:33:47    

:pfff:  
 
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 :D


Message édité par Deadog le 04-02-2003 à 22:34:35
Reply

Marsh Posté le 04-02-2003 à 22:34:27    

ben non, redéfinir ça veut pas dire ça.

Reply

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"


Message édité par Deadog le 04-02-2003 à 22:36:33
Reply

Marsh Posté le 04-02-2003 à 22:38:18    

mais non putain!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Reply

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  
 
 
?

Reply

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

Reply

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

Reply

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;
      }
   }
}

Reply

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; ; );}
 
 
;)

Reply

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.

Reply

Marsh Posté le 04-02-2003 à 23:03:35    

ok, j'essayerai de m'en souvenir :jap:

Reply

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)

Reply

Marsh Posté le 04-02-2003 à 23:08:24    

ok, merci bcp :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed