OVH Cloud OVH Cloud

declaration dans un for

7 réponses
Avatar
korchkidu
Bonjour,

je connais le probleme de declarer des choses du genre:

for (int i....)

Dans ce cas (sauf erreur) VC++6.0 declare i dans le scope du dessus.
VC++.NET lui declare i dans le scope du for...
Mais si je fais ca:

for (int i=0;i<1;++i);
for (i=0;i<1;++i);

VC++.NET compile sans warning. (alors que je m'attends a avoir une
erreur sur le 2e for)
gcc lui me sort une erreur sur la premiere declaration du i...

On m'aurait menti? J'avoue etre completement perdu la.

K.

7 réponses

Avatar
Arnaud Meurgues
korchkidu wrote:

Dans ce cas (sauf erreur) VC++6.0 declare i dans le scope du dessus.
VC++.NET lui declare i dans le scope du for...
Mais si je fais ca:

for (int i=0;i<1;++i);
for (i=0;i<1;++i);

VC++.NET compile sans warning. (alors que je m'attends a avoir une
erreur sur le 2e for)


Ah oui, c'est bizarre. Surtout qu'il accepte aussi sans broncher

for (int i=0;i<1;++i);
for (int i=0;i<1;++i);

Mais en regardant les options du projet, j'ai trouvé d'où ça venait. Ils
ont dû faire une extension afin de ne pas casser le code msvc6. On peut
demander le comportement standard dans :

Properties -> C/C++ -> Language
Force Conformance In For Loop Scope
-> Yes (/Zc:forScope)

Ce qui est bizarre, c'est qu'avec leur extension, on peut écrire :

for (int i=0;i<1;++i);
for (int i=0;i<1;++i);
i = 3;

Ça veut dire qu'il accepte que le premier "int i" défini une variable i
dans le scope englobant, mais qu'on peut la redéfinir dans un autre for...

On m'aurait menti? J'avoue etre completement perdu la.


Le devoir de compatibilité oblige parfois à des gymnastiques insensées.

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
korchkidu
dark poulpo wrote:

non pas d'erreur, apres un for on attend un bloc ou une instruction, toutes
les variables declarées dans un bloc superieur sont utilisables dans un bloc
inferieur.
Il y a un ";" apres le for. Le i n'est donc pas declare pour le 2e for.


Exemple:

for (int i=0;i<1;++i)
i=3;

compile sans probleme.

Par contre

for (int i=0;i<1;++i);
i=3;

me sort une erreur sur le i=3 (normal, il n'est plus declare).

Par contre, sans utiliser le "Force Conformance In For Loop Scope" (donc
i est declare dans le scope au dessus du for, ca compile sans probleme.


K.

Avatar
dark poulpo
"Arnaud Meurgues" a écrit dans le message
de news:41a5d61e$0$17075$
korchkidu wrote:

Dans ce cas (sauf erreur) VC++6.0 declare i dans le scope du dessus.
VC++.NET lui declare i dans le scope du for...
Mais si je fais ca:

for (int i=0;i<1;++i);
for (i=0;i<1;++i);

VC++.NET compile sans warning. (alors que je m'attends a avoir une
erreur sur le 2e for)



non pas d'erreur, apres un for on attend un bloc ou une instruction, toutes
les variables declarées dans un bloc superieur sont utilisables dans un bloc
inferieur.


Ah oui, c'est bizarre. Surtout qu'il accepte aussi sans broncher

for (int i=0;i<1;++i);
for (int i=0;i<1;++i);

Mais en regardant les options du projet, j'ai trouvé d'où ça venait. Ils
ont dû faire une extension afin de ne pas casser le code msvc6. On peut
demander le comportement standard dans :

Properties -> C/C++ -> Language
Force Conformance In For Loop Scope
-> Yes (/Zc:forScope)

Ce qui est bizarre, c'est qu'avec leur extension, on peut écrire :

for (int i=0;i<1;++i);
for (int i=0;i<1;++i);
i = 3;


tu nas jamais fais gaffe que part exemple on pouvait declarer une variable
golbale i et redeclarer cette meme variable i dans une procedure ou
fonction, je pense que c la meme regle ici.


Avatar
Andre Heinen
On Thu, 25 Nov 2004 15:12:31 +0100, "dark poulpo"
wrote:

for (int i=0;i<1;++i);
for (i=0;i<1;++i);

VC++.NET compile sans warning. (alors que je m'attends a avoir une
erreur sur le 2e for)



non pas d'erreur, apres un for on attend un bloc ou une instruction,


Il y en a une: le point-virgule est l'instruction vide. Le for
du dessous n'est donc pas dans la portée de celui du dessus.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz



Avatar
Arnaud Meurgues
dark poulpo wrote:

for (int i=0;i<1;++i);
for (i=0;i<1;++i);

VC++.NET compile sans warning. (alors que je m'attends a avoir une
erreur sur le 2e for)
non pas d'erreur, apres un for on attend un bloc ou une instruction, toutes


les variables declarées dans un bloc superieur sont utilisables dans un bloc
inferieur.


Tu as dû rater les ";" en fin de for.


Ce qui est bizarre, c'est qu'avec leur extension, on peut écrire :

for (int i=0;i<1;++i);
for (int i=0;i<1;++i);
i = 3;



tu nas jamais fais gaffe que part exemple on pouvait declarer une variable
golbale i et redeclarer cette meme variable i dans une procedure ou
fonction, je pense que c la meme regle ici.


Ben pas vraiment. Si i est déclaré dans le scope englobant,
for (int i=0;i<1;++i);
est équivalent à
int i;
for (int i=0;i<1;++i);

Ceci répété deux fois est une redéfinition de i qui n'est pas autorisée.

--
Arnaud
(Supprimez les geneurs pour me répondre)



Avatar
dark poulpo
"Andre Heinen" a écrit dans le message de
news:
On Thu, 25 Nov 2004 15:12:31 +0100, "dark poulpo"
wrote:

for (int i=0;i<1;++i);
for (i=0;i<1;++i);

VC++.NET compile sans warning. (alors que je m'attends a avoir une
erreur sur le 2e for)



non pas d'erreur, apres un for on attend un bloc ou une instruction,


Il y en a une: le point-virgule est l'instruction vide. Le for
du dessous n'est donc pas dans la portée de celui du dessus.


autant pour moi, je lavais pas vu!!!




Avatar
korchkidu
dark poulpo wrote:

autant pour moi, je lavais pas vu!!!
Dans ce cas on dit "au temps pour moi" ;)


Ok, je sors...

K.