Pourquoi est-ce que j'en vois autant pour les constructions (;;)? [fermé]

14

À ma façon de penser, une boucle for est utilisée pour itérer sur une plage connue ou déterminable.

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

ce qui équivaut (portée de i de côté) à:

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

En d'autres termes, la forboucle est simplement un sucre syntaxique (très utile) pour une whileconstruction couramment utilisée .

Cependant, je vois beaucoup de for(;;)constructions sur le Web qui sont fonctionnellement équivalentes àwhile(true)

Quel en est le raisonnement? Pourquoi la boucle for infinie serait-elle préférée à la boucle while infinie?

// J'ai même vu un manuel java qui n'utilisait pas du tout de boucles while! Menant à des constructions monstrueuses telles que:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}
Chris Cudmore
la source
La raison principale est la préférence. La lisibilité doit entrer en jeu lors du choix du YMMV.
Aaron McIver
Pourquoi quelqu'un préférerait-il la construction maladroite?
Chris Cudmore
10
Vous pouvez échanger whileet forici et la question ne changera pas. while(true)et for(;;)signifient la même chose. Vous avez évidemment une forte préférence pour while, d'autres peuvent avoir une préférence tout aussi forte pour for. Il est impossible de dire que l'un est plus correct que l'autre.
Caleb
3
@chris, je ne trouve pas du tout for(;;)déroutant. C'est un idiome C standard, que vous allez documenter dans la section 3.5 de K&R (2e). Je comprends que vous ne l'aimez pas; vous devez comprendre que les autres le préfèrent évidemment (sinon vous ne le verriez jamais). Il peut être plus ou moins acceptable dans des langues autres que C; vous avez étiqueté cette langue-agnostique qui ne fait que diminuer la possibilité d'une réponse définitive. Encore une fois, j'ai voté pour fermer parce que le Q n'est pas constructif; si j'avais été offensé, j'aurais signalé l'offensive au lieu ou en plus de la fermeture. C'est tout.
Caleb
1
Personnellement, je pense qu'il y a une réelle opportunité ici d'avoir une autre syntaxe entièrement pour les boucles infinies: quelque chose commewheeeeeeee { ... }
Detly

Réponses:

33

C'est un maintien des anciennes pratiques de programmation sur le PDP-11 (oui, j'ai dit vieux ). Il permet de sauvegarder une seule instruction, ce qui est utile pour accélérer l'exécution des boucles.

Voir les informations suivantes pour plus d'informations: http://www.flounder.com/exceptions.htm

Edward Robertson
la source
3
C'est précisément ce que je cherchais. Il existe une raison réelle et légitime, mais elle n'est plus valable.
Chris Cudmore
1
@chris Nnnope, les compilateurs modernes se plaindront parfois d'utiliser une constante en condition de boucle. Ce n'est pas purement une gueule de bois.
Izkata
Il y a plus que cela. Je me souviens avoir écrit C au début des années 90 sur des systèmes Unix et alors que (vrai) {} n'était pas une option. Il n'y avait pas de type booléen standard, mais plusieurs systèmes Unix ont défini le leur dans les fichiers d'en-tête C. De mémoire, au moins un fournisseur Unix a défini TRUE comme supposé zéro pour aider au traitement des retours de fonction car la convention était de retourner zéro en cas de succès, et les nombres positifs étaient des échecs. Cela signifiait que (TRUE) {} n'était pas portable.
Michael Shaw
1
Je ne le trouve pas pour le moment, mais je pourrais jurer qu'il y a quelques années Dennis Ritchie a écrit un article sur Usenet déclarant que c'était tout simplement faux, et il / elles utilisent la for(;;)syntaxe comme (à leur avis) une déclaration plus directe de intention qu'aucun critère ne soit énoncé pour sortir de la boucle.
Jerry Coffin
@Ptolemy: Eh bien, vous auriez certainement pu écrire while(1) { }.
Ed S.
10

certains compilateurs donneront un avertissement (quelque chose comme l' expression conditionnelle est constante ) lors de l'utilisation, while( 1 )mais avec for( ; ; )rien à avertir. Les programmeurs veulent du code sans avertissements, ils utilisent donc la variante for.

stijn
la source
Cependant, certaines choses que les compilateurs mettent en garde sont parfaitement valides et même (dans certains cas spéciaux) inévitables. Certains d'entre nous traitent donc les avertissements comme des avertissements. Si vous les ignorez, bien sûr, vous pouvez vous laisser submerger par les damnés choses et ne pas voir les importantes - mais il existe des pragmas et des options pour désactiver les avertissements, localement ou globalement. Fondamentalement, oui, il vaut mieux ne pas avoir d'avertissement, mais j'ai généralement besoin d'une raison plus forte que celle d'adopter un style de code pire. Ici, ce n'est pas pire simplement différent, mais les boucles "infinies" sont rares (ou bien très mauvais style) de toute façon.
Steve314
5

C'est une habitude acquise de la programmation C où il n'y a pas de type booléen. Bien que (1) soit potentiellement l'équivalent, For (;;) est souvent utilisé car il apparaît dans K&R si je me souviens bien. Je soupçonne qu'il y avait aussi une raison matérielle quelque part.

Ingénieur du monde
la source
4
... soupçonne qu'il y avait une raison matérielle ...
Aaron McIver
2
Comme Edward Robertson l'a mentionné, la raison en est que le compilateur C sur le PDP-11 ne s'est pas rendu compte que le vrai dans "tandis que (vrai)" était une constante de temps de compilation et ajouterait une instruction supplémentaire (une comparaison) lors de la génération de l'assemblage. En raison des ressources limitées disponibles sur le PDP-11, les programmeurs ont utilisé la boucle for pour optimiser cette instruction supplémentaire hors du programme.
Jetti
3

car (;;) peut être lu comme "pour toujours" que certains trouvent plus naturel que "tout en étant vrai".

Oskar N.
la source
Bien que ce ne soit pas la raison d'origine, c'est une raison secondaire pour laquelle la préférence est restée longtemps après que la raison d'origine est devenue obsolète. Cependant, il est très difficile de trouver des preuves à l'appui, à part demander à des programmeurs expérimentés.
DarenW
-2

Tous les programmeurs expérimentés à qui j'ai demandé peuvent reconnaître for(;;)plus rapidement que while(true)ou while(1).

Kevin Cline
la source
2
Tout programmeur qui en vaut la peine devrait être capable de reconnaître les trois instantanément. Tous les trois sont suffisamment communs pour que quiconque a passé plus de 5 minutes à lire le code les ait vus plusieurs fois.
cHao
1
Des études ont montré que les programmeurs expérimentés peuvent comprendre for(;;)14 ms plus rapidement que while(1):-)
kevin cline