Est-il possible d’utiliser la fonction break
pour quitter plusieurs boucles nestedes? Si oui, comment vous y prendrez-vous? Pouvez-vous également contrôler le nombre de boucles qu’il y a dans la coupure?
AFAIK, C ++ ne supporte pas les boucles de nommage, comme le font Java et les autres langages. Vous pouvez utiliser un goto ou créer une valeur de drapeau que vous utilisez. À la fin de chaque boucle, vérifiez la valeur du drapeau. Si elle est définie sur true, vous pouvez sortir de cette itération.
Non, ne le gâchez pas avec une break
. C’est le dernier bastion restant pour l’utilisation du goto
.
Une autre approche pour sortir d’une boucle nestede consiste à factoriser les deux boucles en une fonction distincte et à return
de cette fonction lorsque vous souhaitez quitter.
Bien sûr, cela soulève l’autre argument, à savoir si vous devez toujours return
explicitement d’une fonction ailleurs qu’à la fin.
Juste pour append une réponse explicite en utilisant lambdas:
for (int i = 0; i < n1; ++i) { [&] { for (int j = 0; j < n2; ++j) { for (int k = 0; k < n3; ++k) { return; // yay we're breaking out of 2 loops here } } }(); }
Bien sûr, ce modèle a certaines limitations et évidemment C ++ 11 seulement, mais je pense que c'est très utile.
break ne quittera que la boucle la plus interne qui le contient.
Vous pouvez utiliser goto pour sortir de n’importe quel nombre de boucles.
Bien sûr, le goto est souvent considéré comme nuisible .
est-il approprié d’utiliser la fonction de pause […]?
Utiliser break and goto peut rendre plus difficile la raison de l’exactitude d’un programme. Voir ici pour une discussion à ce sujet: Dijkstra n’était pas fou .
Bien que ce vêtement ait déjà été présenté, je pense qu’une bonne approche consiste à faire ce qui suit:
for(unsigned int z = 0; z < z_max; z++) { bool gotoMainLoop = false; for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++) { for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++) { //do your stuff if(condition) gotoMainLoop = true; } } }
Que dis-tu de ça?
for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { //Some statement if (condition) { j=50; k=50; } } } }
Une bonne façon de sortir de plusieurs boucles nestedes consiste à réorganiser votre code en une fonction:
void foo() { for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { // If condition is true return; } } } }
Un exemple de code utilisant goto
et une étiquette pour sortir d’une boucle nestede:
for (;;) for (;;) goto theEnd; theEnd:
goto peut être très utile pour briser les boucles nestedes
for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 1000; k++) { for (l = 0; l < 1000; l++){ .... if (condition) goto break_me_here; .... } } } } break_me_here: // Statements to be executed after code breaks at if condition
L’instruction
break
termine l’exécution de l’instructiondo
,for
,switch
ouwhile
la plus proche dans laquelle elle apparaît. Le contrôle passe à l’instruction qui suit l’instruction terminée.
de msdn .
Je pense qu’un goto
est valable dans ces circonstances:
Pour simuler une break
/ continue
, vous souhaitez:
for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { goto theEnd; } } } theEnd:
for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { i++; goto multiCont; } } multiCont: }
D’autres langages tels que PHP acceptent un paramètre pour break (c.-à-d. Break 2;) pour spécifier la quantité de niveaux de boucles nestedes que vous voulez séparer, mais C ++ n’en fait pas. Vous devrez régler le problème en utilisant un booléen défini sur false avant la boucle, défini sur true dans la boucle si vous voulez le casser, plus un saut conditionnel après la boucle nestede, en vérifiant si le booléen est défini sur true et casser si oui.
Je sais que c’est un ancien message. Mais je suggère une réponse un peu plus logique et plus simple.
for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < conditionj; j++) { for(unsigned int k=0; k< conditionk ; k++) { // If condition is true j= conditionj; break; } } }
Vous pouvez utiliser essayer … attraper.
try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if(i*j == 42) throw 0; // this is something like "break 2" } } } catch(int e) {} // just do nothing // just continue with other code
Si vous devez sortir de plusieurs boucles à la fois, c'est souvent une exception de toute façon.
while (i
Sortir d’une for-loop me semble un peu étrange, car la sémantique d’une boucle for indique généralement qu’elle exécutera un nombre de fois spécifié. Cependant, ce n’est pas mauvais dans tous les cas; si vous cherchez quelque chose dans une collection et que vous voulez la casser après l’avoir trouvée, c’est utile. La rupture des boucles nestedes n’est cependant pas possible en C ++; c’est dans d’autres langues grâce à l’utilisation d’une pause étiquetée. Vous pouvez utiliser une étiquette et un goto, mais cela pourrait vous donner des brûlures d’estomac le soir ..? Cela semble être la meilleure option.