Quelle est la bonne façon de convertir une boucle à une boucle while?

voix
1

J'ai une boucle de la forme:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}

Et je veux le convertir en une boucle while ( la plupart du temps parce que je veux jouer avec la valeur de l' iintérieur de la boucle pour revenir en arrière et en avant et mon collègue pense que faire cela dans une boucle est sujette à des problèmes. J'ai tendance à d' accord avec lui). J'ai donc écrit quelque chose comme ceci:

int i = from;
while (i < to) {
  try {
    // do some code (I don't know exactly what, it is subject to change)
  } finally {
    i++;
  }
}

Ce qui a incité certains des commentaires à voix haute. Mon raisonnement est que vous ne savez pas ce que le code de la boucle fait - il peut (et fait) ont plusieurs continuecommandes.

il a écrit ceci comme réponse:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}

Certes ses lignes moins, mais je pense que mon code est plus élégant - que pensez-vous?

Créé 03/11/2009 à 18:26
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
3

Et je veux le convertir en une boucle while (la plupart du temps parce que je veux jouer avec la valeur de i dans la boucle pour revenir en arrière et en avant et mon collègue pense que faire cela dans une boucle est sujette à des problèmes. Je tends d'accord avec lui).

Ceci est tout à fait acceptable dans la plupart des langues. Il n'y a aucune raison d'éviter une boucle.

Créé 03/11/2009 à 18:30
source utilisateur

voix
5

Jouer avec la valeur de l' index alors que dans une structure de mise en boucle est sujette à des problèmes, quelle que soit la structure en boucle est .

Il ne va pas à la matière si elle est une boucle ou une boucle while, le point est-ce que le indexeur finira par vous conduire à prendre une décision de résiliation de la boucle?

Si vous êtes convaincu que vous êtes indexeur finira par causer votre condition de sortie à atteindre, alors c'est tout ce que vous devrait se préoccuper, pas si d'utiliser un ou pour un certain temps.

Créé 03/11/2009 à 18:31
source utilisateur

voix
0

La meilleure façon de le faire serait de ne pas convertir en une boucle while, comme ci-dessous.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Créé 03/11/2009 à 18:33
source utilisateur

voix
2

Il me semble qu'il peut être plus facile et plus lisible pour convertir:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}

et séparer ainsi la terminaison de la boucle à partir de l'incrémentation variable.

Si je vois une boucle avec un chèque de fin de course (par exemple i < limit) je aurais tendance à penser qu'il ya une variable qui est modifiée d'une manière cohérente (raisonnable) de la mode. Il n'y a aucune raison pour laquelle vous ne pouvez pas faire ce que vous voulez, mais je pencherais vers le comportement plus lisible et plus attendu.

Créé 03/11/2009 à 18:34
source utilisateur

voix
0

Pour répondre à la question sur quel code je choisirais; Je choisis votre code plus. Il est beaucoup plus facile à lire la première boucle (plus). Et oui, je peux lire la seconde, mais même si vous avez beaucoup d'expérience vous devez regarder deux fois pour savoir ce que la boucle fait. De plus, le compilateur d'optimiser le code assez bien.

Créé 03/11/2009 à 18:35
source utilisateur

voix
1

Pourquoi prendre la peine avec des boucles stupides quand vous pouvez faire la même chose (et bien plus encore!) Avec le super-puissant goto?

i = fro;
my_loop:
//all your stuff here
i++;
if (i < to) goto my_loop;

Si vous êtes un de ces programmeurs pusillanimes qui diminuent la goto, vous pouvez essayer avec ceci:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Créé 03/11/2009 à 18:38
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more