Dans une boucle C # (n’hésitez pas à répondre pour les autres langues), quelle est la différence entre break et continue comme moyen de quitter la structure de la boucle et de passer à la prochaine itération?
Exemple:
foreach (DataRow row in myTable.Rows) { if (someConditionEvalsToTrue) { break; //what's the difference between this and continue ? //continue; } }
break
sortira complètement de la boucle, continue
simplement l’itération en cours.
Par exemple:
for (int i = 0; i < 10; i++) { if (i == 0) { break; } DoSomeThingWith(i); }
La rupture provoquera la sortie de la boucle lors de la première itération - DoSomeThingWith
ne sera jamais exécuté. Ça ici:
for (int i = 0; i < 10; i++) { if(i == 0) { continue; } DoSomeThingWith(i); }
DoSomeThingWith
pas DoSomeThingWith
pour i = 0
, mais la boucle continuera et DoSomeThingWith
sera exécuté pour i = 1
à i = 9
.
Un moyen très simple de comprendre cela est de placer le mot “loop” après chacun des mots-clés. Les termes ont maintenant du sens s’ils sont simplement lus comme des phrases de tous les jours.
break
loop – le bouclage est rompu et s’arrête.
continue
loop – la boucle continue à s’exécuter avec la prochaine itération.
break provoque le saut du programme hors de la scope de la boucle la plus interne
for(i = 0; i < 10; i++) { if(i == 2) break; }
Fonctionne comme ça
for(i = 0; i < 10; i++) { if(i == 2) goto BREAK; } BREAK:;
continuer à sauter à la fin de la boucle. Dans une boucle for, continuez jusqu'à l'expression d'incrément.
for(i = 0; i < 10; i++) { if(i == 2) continue; printf("%d", i); }
Fonctionne comme ça
for(i = 0; i < 10; i++) { if(i == 2) goto CONTINUE; printf("%d", i); CONTINUE:; }
break
arrêterait complètement la boucle foreach
, continue
au prochain DataRow
.
Il y a plus que quelques personnes qui n’aiment pas la break
et continue
. La dernière plainte que j’ai vue à leur sujet était en JavaScript: The Good Parts de Douglas Crockford. Mais je trouve que parfois, l’utilisation de l’un d’eux simplifie vraiment les choses, surtout si votre langage ne comprend pas un style de boucle à do-until
ou à do-until
.
J’ai tendance à utiliser des boucles d’ break
qui recherchent quelque chose dans une liste. Une fois trouvé, il ne sert à rien de continuer, alors vous pourriez tout aussi bien quitter.
J’utilise continue
lorsque je fais quelque chose avec la plupart des éléments d’une liste, mais je veux tout de même en sauter quelques-uns.
La déclaration de break
est également utile lors de la recherche d’une réponse valide de la part de quelqu’un ou de quelque chose. Au lieu de:
Ask a question While the answer is invalid: Ask the question
Vous pourriez éliminer certains doublons et utiliser:
While True: Ask a question If the answer is valid: break
La boucle à do-until
que j’ai mentionnée précédemment est la solution la plus élégante à ce problème particulier:
Do: Ask a question Until the answer is valid
Pas de duplication et pas de break
non plus.
Tous ont donné une très bonne explication. Je publie toujours ma réponse pour donner un exemple si cela peut aider.
// break statement for (int i = 0; i < 5; i++) { if (i == 3) { break; // It will force to come out from the loop } lblDisplay.Text = lblDisplay.Text + i + "[Printed] "; }
Voici la sortie:
0 [Imprimé] 1 [Imprimé] 2 [Imprimé]
So 3 [Printed] & 4 [Printed] ne sera pas affiché car il y a une rupture quand i == 3
//continue statement for (int i = 0; i < 5; i++) { if (i == 3) { continue; // It will take the control to start point of loop } lblDisplay.Text = lblDisplay.Text + i + "[Printed] "; }
Voici la sortie:
0 [Imprimé] 1 [Imprimé] 2 [Imprimé] 4 [Imprimé]
Donc 3 [Imprimé] ne sera pas affiché car il y a continuer quand i == 3
J’avais toujours l’habitude de me demander si je devais utiliser la pause ou continuer. C’est ce qui m’aide à me rappeler:
Pause
Break force une boucle à sortir immédiatement.
Continuer
Cela fait le contraire de la rupture. Au lieu de terminer la boucle, il reboucle immédiatement, ignorant le rest du code.
Par exemple
foreach(var i in Enumerable.Range(1,3)) { Console.WriteLine(i); }
Imprime 1, 2, 3 (sur des lignes séparées).
Ajouter une condition de rupture à i = 2
foreach(var i in Enumerable.Range(1,3)) { if (i == 2) break; Console.WriteLine(i); }
Maintenant, la boucle imprime 1 et s’arrête.
Remplacez la pause par une poursuite.
foreach(var i in Enumerable.Range(1,3)) { if (i == 2) continue; Console.WriteLine(i); }
Maintenant, pour boucler les impressions 1 et 3 (saut 2).
Ainsi, break
arrête la boucle, alors que continue
passe à la prochaine itération.
Ruby est malheureusement un peu différent. PS: Ma mémoire est un peu floue sur ce point, alors excuses si je me trompe
au lieu de break / continue, il y a break / next, qui se comportent de la même manière en termes de boucles
Les boucles (comme tout le rest) sont des expressions et “renvoient” la dernière chose qu’elles ont faite. La plupart du temps, obtenir la valeur de retour d’une boucle est inutile, alors tout le monde le fait
a = 5 while a < 10 a + 1 end
Vous pouvez cependant le faire
a = 5 b = while a < 10 a + 1 end # b is now 10
Cependant, beaucoup de code Ruby «émule» une boucle en utilisant un bloc. L’exemple canonique est
10.times do |x| puts x end
Comme il est beaucoup plus courant pour les gens de vouloir faire les choses avec le résultat d’un bloc, c’est là que ça devient désordonné. break / next signifie différentes choses dans le contexte d'un bloc.
pause va sauter du code qui a appelé le bloc
next ignorera le rest du code dans le bloc et 'renverra' ce que vous spécifiez à l'appelant du bloc. Cela n'a aucun sens sans exemples.
def timesten 10.times{ |t| puts yield t } end timesten do |x| x * 2 end # will print 2 4 6 8 ... and so on timesten do |x| break x * 2 end # won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped timesten do |x| break 5 x * 2 end # This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5 timesten do |x| next 5 x * 2 end # this would print 5 5 5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.
Donc voilà. Ruby est génial, mais il y a de très mauvais casiers. C'est le deuxième pire que j'ai vu dans mes années d'utilisation 🙂
Réponse simple:
La rupture quitte la boucle immédiatement.
Continuer commence le traitement de l’article suivant. (S’il y en a, en sautant à la ligne d’évaluation du pour / tout)
S’il vous plaît laissez-moi énoncer l’évidence: notez que l’ajout ni pause ni continuer, va reprendre votre programme; c’est-à-dire que je suis resté coincé pour une certaine erreur, puis après l’être connecté, je voulais reprendre le traitement, et il y avait plus de tâches de code entre la ligne suivante, alors je l’ai laissé tomber.
Pour sortir complètement d’une boucle foreach, le break est utilisé;
Pour aller à la prochaine itération de la boucle, continue est utilisé;
Le saut est utile si vous parcourez une collection d’objects (comme des lignes dans une liste de données) et que vous recherchez une correspondance particulière, lorsque vous trouvez cette correspondance, vous n’avez pas besoin de continuer à traverser les lignes restantes afin de rompre en dehors.
Continuer est utile lorsque vous avez accompli ce dont vous avez besoin pour effectuer une itération en boucle. Vous aurez normalement continuer après un si .
Si vous ne voulez pas utiliser break, vous augmentez simplement la valeur de I de manière à ce que la condition d’itération soit fausse et que la boucle ne s’exécute pas à la prochaine itération.
for(int i = 0; i < list.Count; i++){ if(i == 5) i = list.Count; //it will make "i
Comme pour les autres langues:
'VB For i=0 To 10 If i=5 then Exit For '= break in C#; 'Do Something for i<5 next For i=0 To 10 If i=5 then Continue For '= continue in C# 'Do Something for i<>5... Next