Question

Dans une boucle C# (n'hésitez pas à répondre pour d'autres langages), quelle est la différence entre break et continue comme moyen de quitter la structure de la boucle et de passer à l'itération suivante ?

Exemple:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}
Était-ce utile?

La solution

break sortira complètement de la boucle, continue je vais juste sauter l’itération actuelle.

Par exemple:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

La pause entraînera la sortie de la boucle à 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);
}

Ne s'exécutera pas DoSomeThingWith pour i = 0, mais la boucle le fera continuer et DoSomeThingWith sera exécuté pour i = 1 à i = 9.

Autres conseils

Un moyen très simple de comprendre cela est de placer le mot « boucle » après chacun des mots-clés.Les termes ont désormais un sens s’ils sont simplement lus comme des phrases de tous les jours.

break boucle - la boucle est interrompue et s'arrête.

continue boucle - la boucle continue de s'exécuter avec l'itération suivante.

casser fait sortir le compteur du programme de la portée 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 saute à la fin de la boucle.Dans une boucle for, continuez à passer à l'expression d'incrémentation.

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 le foreach boucle complètement, continue je passerais au suivant DataRow.

J'avais toujours l'habitude de ne pas savoir si je devais utiliser break ou continuer.Voici ce qui m'aide à me souvenir :

Quand utiliser pause ou continuer ?

  1. Casser - c'est comme rompre.C'est triste, vous vous séparez.

Break

  1. Continuer - signifie que vous allez vous reposer aujourd'hui et régler tout cela demain (c'est-à-diresauter l'itération actuelle) !

Continue

Il y a plusieurs personnes qui n'aiment pas break et continue.La dernière plainte que j'ai vue à leur sujet était dans Javascript :Les bonnes pièces par Douglas Crockford.Mais je trouve que parfois utiliser l'un d'entre eux simplifie vraiment les choses, surtout si votre langage n'inclut pas de do-while ou do-until style de boucle.

J'ai tendance à utiliser break dans des boucles qui recherchent quelque chose dans une liste.Une fois trouvé, cela ne sert à rien de continuer, alors autant arrêter.

j'utilise continue lorsque vous faites quelque chose avec la plupart des éléments d'une liste, mais que vous souhaitez quand même en sauter quelques-uns.

Le break Cette déclaration est également utile lors d'un sondage pour obtenir une réponse valide de quelqu'un ou de quelque chose.Au lieu de:

Ask a question
While the answer is invalid:
    Ask the question

Vous pouvez éliminer certaines duplications et utiliser :

While True:
    Ask a question
    If the answer is valid:
        break

Le do-until La boucle 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 non break nécessaire non plus.

Tous ont donné une très bonne explication.Je publie toujours ma réponse juste 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 le résultat :

0[Imprimé] 1[Imprimé] 2[Imprimé]

Donc 3[Printed] & 4[Printed] ne seront pas affichés car il y a une pause lorsque 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 le résultat :

0[Imprimé] 1[Imprimé] 2[Imprimé] 4[Imprimé]

Donc 3[Printed] ne sera pas affiché car il y a continuation quand i == 3

Casser

Break force une boucle à sortir immédiatement.

Continuer

Cela fait le contraire de la pause.Au lieu de terminer la boucle, elle recommence immédiatement, sautant le reste 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 le break par un continue.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

Maintenant, bouclez les impressions 1 et 3 (en sautant 2).

Ainsi, break arrête la boucle, alors que continue passe à l'itération suivante.

Ruby est malheureusement un peu différent.PS :Ma mémoire est un peu floue à ce sujet alors désolé si je me trompe

au lieu de break/continue, il a break/next, qui se comporte de la même manière en termes de boucles

Les boucles (comme tout le reste) 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, donc tout le monde fait ça

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, de nombreux codes Ruby « émulent » une boucle en utilisant un bloc.L'exemple canonique est

10.times do |x|
    puts x
end

Comme il est beaucoup plus courant que les gens veuillent faire des choses avec le résultat d’un blocage, c’est là que ça devient compliqué.break/next signifie différentes choses dans le contexte d'un bloc.

break sortira du code qui a appelé le bloc

next ignorera le reste du code dans le bloc et « retournera » 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 a des cas extrêmes.C'est le deuxième pire que j'ai vu au cours de mes années d'utilisation :-)

Réponse simple :

Casser sort immédiatement de la boucle.
Continuer commence à traiter l’élément suivant.(S'il y en a, en sautant à la ligne d'évaluation du for/while)

S'il vous plaît, laissez-moi énoncer une évidence :notez que l'ajout de ni break ni continue reprendra votre programme ;c'est à dire.J'ai piégé une certaine erreur, puis après l'avoir enregistrée, j'ai voulu reprendre le traitement, et il y avait plus de tâches de code entre la ligne suivante, alors je l'ai simplement laissé passer.

Pour sortir complètement d'une boucle foreach, casser est utilisé;

Pour passer à l'itération suivante de la boucle, continuer est utilisé;

Casser est utile si vous parcourez une collection d'objets (comme des lignes dans une table de données) et que vous recherchez une correspondance particulière, lorsque vous trouvez cette correspondance, il n'est pas nécessaire de continuer à travers les lignes restantes, vous souhaitez donc sortir .

Continuer est utile lorsque vous avez accompli ce dont vous avez besoin dans une itération de boucle.Vous aurez normalement continuer après un si.

si vous ne voulez pas utiliser casser vous augmentez simplement la valeur de I de telle manière que cela rende la condition d'itération fausse et que la boucle ne s'exécutera pas à la prochaine itération.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

Quant aux 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top