Pourquoi ne puis-je pas mettre une variable dans la déclaration de la portion d'une boucle while?
Vous pouvez, bien évidemment, de mettre une déclaration de variable dans une boucle for:
for (int i = 0; ...
et j'ai remarqué que vous pouvez faire la même chose en si et instructions de commutation:
if ((int i = f()) != 0) ...
switch (int ch = stream.get()) ...
Mais quand j'essaie de faire la même chose dans une boucle while:
while ((int ch = stream.get()) != -1) ...
Le compilateur (VC++ 9.0) ne l'aime pas du tout.
Est ce comportement conforme? Est-il une raison pour cela?
MODIFIER: j'ai trouvé que je peux faire ceci:
while (int ch = stream.get() != -1) ...
mais en raison de règles de priorité, c'est interprétée comme:
while (int ch = (stream.get() != -1)) ...
qui n'est pas ce que je veux.
gcc ne me laisse pas déclarer une variable dans l'instruction "if", soit, en fait
Ne pas vous dire tout (int ch = (flux de données.get() != -1)) dans le dernier exemple?
comme une option pour contourner ce problème, vous pouvez envisager l'opérateur virgule: while (int ch, (ch = stream.obtenez de l'()) != -1) {//faire des trucs ici}
oui, bien sûr. modifiés en conséquence.
Seulement pour
Ne pas vous dire tout (int ch = (flux de données.get() != -1)) dans le dernier exemple?
comme une option pour contourner ce problème, vous pouvez envisager l'opérateur virgule: while (int ch, (ch = stream.obtenez de l'()) != -1) {//faire des trucs ici}
oui, bien sûr. modifiés en conséquence.
Seulement pour
if
et switch
. Voir aussi Pourquoi pas "alors que la déclaration avec initialisation"?OriginalL'auteur Ferruccio | 2008-10-10
Vous devez vous connecter pour publier un commentaire.
La grammaire pour une condition dans le '03 standard est défini comme suit:
Le ci-dessus ne sera donc permettre à des conditions telles que:
La norme permet à la condition de déclarer une variable, cependant, qu'ils l'ont fait par l'ajout d'une nouvelle règle de grammaire appelée "condition" qui peut être une expression ou une déclaration avec un initialiseur. Le résultat est que juste parce que vous êtes dans l'état d'un
if
,for
,while
, ouswitch
ne signifie pas que vous pouvez déclarer une variable à l'intérieur d'une expression.OriginalL'auteur
Ce ne semble pas être le comportement conforme. Partie 6.5.1.2 de la norme précise:
Donc dans votre exemple, le ch doit être déclaré dans le champ d'application de la boucle et de travailler correctement (avec elle être recréé à travers chaque itération de boucle). La raison pour le comportement observé est probablement dû au compilateur de ne pas la portée de la variable correctement et puis déclarant à plusieurs reprises.
OriginalL'auteur
Le problème est, la norme permet une déclaration à l'intérieur de la parenthèse. Ce que vous voulez faire est d'obtenir une déclaration dans le cadre de l'expression, qui est quelque chose que la norme ne sera pas vous laisser faire.
while() peut prendre l'une des deux syntaxes: while(<déclaration>) ou tout(<expression>). La déclaration utilise "=", et ressemble à l'expression, mais c'est une autre entité syntaxique.
Lorsque vous écrivez
c'est parfaitement bien. "int i=1" est une déclaration. Cependant, ce que vous voulez, c'est
Ceci est très différent de l'animal. Vous voulez une expression à l'intérieur de tout(), où l'un des termes de l'expression est une déclaration. Maintenant, la déclaration est une déclaration, et en tant que telle ne peut pas être une partie de l'expression. C'est pourquoi ce que vous avez besoin d'être fait ne peut pas être fait.
(après la rédaction de l'ensemble de la diatribe, j'ai remarqué que les 2 autres ont écrit la même chose. Eh bien, plus on est de fous.)
OriginalL'auteur
Il se peut que le contenu de la tout en de la clause sont évalués à chaque boucle, il serait donc essayer et de le déclarer "ch" à plusieurs reprises.
L'if, switch, et pour la boucle exemples que vous citez ont tous des "ch" étant défini qu'une seule fois.
OriginalL'auteur
Vous peut mettre une déclaration de variable dans l'expression de test d'une boucle while. Ce que vous ne peut pas faire est de mettre une déclaration dans d'autres expressions. Par exemple, dans l'expression a+b+c, vous ne pouvez pas remplacer b par
int i = f()
. Et la même chose est valable pour l'expression(a)
; vous ne pouvez pas insérerint i=f()
pour obtenir une expression(int i=f())
.Donc, dans
while (int i = foo())
, le ultrapériphériques crochets font partie de l'instruction while, et non pas le texte, l'expression, et tout est légal. Danswhile ((int i = foo()))
, le ultrapériphériques entre parenthèses font encore partie de l'instruction while. Le test de l'expression aurait la forme"(" expr ")"
, et vous vous retrouvez avec une erreur de syntaxe.In while ((int i = foo())), the outermost brackets are still part of the while statement. The test-expression would have the form "(" expr ")", and you end up with a syntax error.
, spécialement la dernière phrase du paragraphe, d'expliquer avec un meilleur exemple? merci beaucoup 🙂Ce que j'ai compris est que je peux déclarer la variable x, tandis que l'e.g
while(int x=...)
mais l'initialiseur de la partie i de la.e...
doit contenir l'expression pas de toute déclaration, non?Vous ne pouvez pas utiliser
(( ))
parce que l'intérieur()
sont l'expression d'eux-mêmes, et vous ne pouvez pas avoir une déclaration à l'intérieur. L'extérieur()
appartiennent à lawhile
et ne forment pas une expression. Et oui, l'initialiseur dex
doit être une expression valide lui-même, et ne peut pas contenir une deuxième déclaration.cool, compris maintenant, Merci:)
OriginalL'auteur
Cela ne fonctionne pasje n'ai jamais essayé, mais si le commentaire dans votre édition est correcte, cela devrait fonctionner.VS 2005 n'a même pas de le compiler.
Selon mes sources, l'opérateur virgule est au bas de la priorité à l'échelle - mais il y a quelque chose de cassé avec mon construire.
OriginalL'auteur