Je travaille sur du code C # qui a une syntaxe de boucle que je n'ai jamais vue auparavant:
for (;;)
{
//Do some stuff
}
Que fait une boucle for sans init; condition; ou incrémentation faire? Au fait, il est vraiment difficile de trouver des résultats de recherche significatifs sur Internet pour "for (;;) c # " sur n'importe quel moteur de recherche que j'ai essayé.
-Eric
4 Réponses :
La syntaxe d'une boucle for est donc:
while (true) { // do some stuff }
N'importe lequel de ces éléments peut être omis (selon les spécifications de la langue). Vous avez donc une boucle infinie. Une approche similaire:
for (condition; test; action)
Pour référence, le Projet de spécification C # sur l'instruction for . Notez le message "Si la condition for_condition n'est pas présente ou si l'évaluation est vraie, le contrôle est transféré vers l'instruction incorporée." (c'est moi qui souligne).
L'appel du premier argument condition est déroutant, et le troisième action est vague; les termes du docs - for (initializer; condition; iterator) - racontez une meilleure histoire.
@ mklement0 Je ne me souviens pas pourquoi j'ai mis "condition" ici, donc je suis d'accord avec vous là-dessus, mais la raison pour laquelle j'ai mis "action" est que vous pouvez faire d'autres choses que l'incrémentation d'une variable.
Bien qu'il soit possible de faire d'autres choses dans la section itérateur , son objectif principal est d'itérer, donc je pense qu'il vaut mieux l'appeler itérateur - tout en ajoutant peut-être une note qui souligne que vous n'êtes techniquement pas limité à l'incrémentation d'une variable de boucle.
Où dans votre lien est-il indiqué que c'est son objectif principal?
(Vous devez me @ -mention pour être informé des commentaires de suivi). C'est impliqué par le nom de la section et c'est certainement le cas d'utilisation typique. Généralement, si les constructions ont des noms officiels, il est toujours préférable de les utiliser (et de créer un lien vers leur définition) pour éviter toute confusion.
@ mklement0 Et il est toujours préférable de nommer les choses comme un indicateur de ce qu'elles représentent. C'est pourquoi j'ai choisi de l'appeler «action» au lieu d '«itérateur». Le simple fait ici est que, quelle que soit la typicité du cas d'utilisation, le comportement documenté de la troisième partie du for est qu'il peut s'agir d'une expression- -il peut même s'agir de plusieurs expressions.
Il est préférable de nommer les choses pour leur essence - il est impossible de regrouper une histoire complète en un seul nom. Comme suggéré, vous pouvez toujours ajouter une note pour expliquer cela et comment le nom ne raconte pas l'histoire complète . De plus, s'écarter de la terminologie officielle justifie également une note.
Ce type de boucle for est une boucle infinie. C'est l'équivalent de while (true) {trucs à exécuter ...} . Il continue jusqu'à ce qu'il atteigne une pause, un retour ou un passage à une étiquette en dehors de la boucle.
Une boucle for comporte trois parties, une initialisation, une condition et un bloc à exécuter après la boucle. Sans condition à tester, la boucle continuera simplement.
C'est une boucle infinie . Comme vous l'avez dit, il fonctionnera jusqu'à ce qu'une partie de celui-ci se brise (lève une exception ou existe autrement la boucle) ou que la machine soit à court de ressources pour prendre en charge la boucle.
while(true)
{
//do stuff
}
Est identique à:
do
{
//do stuff
}while (true)
for (;;)
{
//do stuff
}
Il n'y a pas de variable à définir sur null . Reportez-vous à la spécification : Les parties 1 et 3 ("for_initializer" et "for_iterator") sont des instructions vides et ne font rien. La partie 2 ("for_condition") est un cas particulier, où l'absence d'une instruction est spécifiée pour être traitée comme si la condition évaluée true .
@Symon Pour être clair, dans le contexte que j'ai lié, le ? indique un symbole facultatif dans la grammaire ANTLR que les compilateurs C # utilisent pour analyser le code source C #. Il n'y a pas de variables C # ici.
@JoeSewell, ahh. Cela a plus de sens. Ce doit être là où ma confusion doit avoir été.
@RufusL, je vois. Lisez plus de documentation à ce sujet et je comprends où je me suis trompé. Merci de l'avoir éclairci!
Bien sûr pas de problème. Merci d'avoir corrigé la réponse +1
pour (;;)
Réponse courte : C'est une boucle infinie qui équivaut à while (true)
Réponse longue : pour (initialiseur; condition; itérateur) Structure de l'instruction for
Si null est nul, continuez. À la fin, nul + nulest la façon dont j'ai toujours lu. C'est une boucle infinie, si je ne me trompe pasAlors ça va à moins qu'il y ait une pause, un lancer ou quelque chose?
@Eric, c'est exact.
@Symon votre commentaire est en fait une réponse. Veuillez l'afficher comme réponse afin que nous puissions la voter :)
Serait-ce une syntaxe valide en C, Java, JavaScript, etc.?
c'est une boucle while (vraie), très mauvais style de code. vous devez casser ou lancer une exception pour sortir de la boucle.
L'instruction de condition vide est la vraie clé ici. Sans condition, la boucle fonctionnera pour toujours à moins que quelque chose à l'intérieur du bloc ne la termine. Je pense qu'il est généralement considéré comme plus intentionnel d'écrire
while (true)parce que cela indique explicitement la condition de boucle infinie (et les conditionswhilene sont pas facultatives).C'était semi-idiomatique dans les premiers jours de C. (Je me souviens d'une macro "mignonne" que quelqu'un a écrite qui ressemblait à
#define EVER ;;qui vous permettait d'écrirepour (EVER) {/ * code * /}). Je me souviens de l'avoir beaucoup vu dans le code C de l'ère des années 80, pas tellement au début du code C et C ++ des années 90 et très rarement au cours des deux dernières décennies. Ouais, je suis si vieux, mais je suppose que la personne qui a écrit le code que vous regardez est aussi vieilleIl est plus jeune que moi; ^)
Copie possible de Utilisation de "for (;;)" dans une application C #? < / a>