Si j'utilise une break
instruction, cela ne cassera que la boucle interne et je dois utiliser un indicateur pour rompre la boucle externe. Mais s'il y a de nombreuses boucles imbriquées, le code n'aura pas l'air bien.
Existe-t-il un autre moyen de rompre toutes les boucles? (Veuillez ne pas utiliser goto stmt
.)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
c
nested-loops
break
user966379
la source
la source
Réponses:
Utilisation:
la source
const int count =1000
, dans l'initialisation globale. ou sous forme de#define
macro.Non, ne gâchez pas le plaisir avec un
break
. Ceci est la dernière utilisation valide restante degoto
;)Sinon, vous pouvez utiliser des indicateurs pour sortir des boucles imbriquées profondes.
Une autre approche pour sortir d'une boucle imbriquée consiste à factoriser les deux boucles dans une fonction distincte et à revenir de cette fonction lorsque vous souhaitez quitter.
Résumé - pour sortir des boucles imbriquées:
goto
Je n'ai pas pu résister à l'inclusion de xkcd ici :)
la source
Les Goto sont considérés comme nuisibles, mais comme de nombreuses personnes dans les commentaires le suggèrent S'il est utilisé judicieusement, il peut être un excellent outil. Tout ce qui est utilisé avec modération est amusant.
la source
la source
Une façon est de mettre toutes les boucles imbriquées dans une fonction et de revenir de la boucle la plus interne en cas de besoin de sortir de toutes les boucles.
la source
Je pense que ça
goto
résoudra le problèmela source
Vous aurez besoin d'une variable booléenne, si vous voulez qu'elle soit lisible:
Si vous le souhaitez moins lisible, vous pouvez rejoindre l'évaluation booléenne:
Comme moyen ultime, vous pouvez invalider la boucle initiale:
la source
Utilisez ce conseil avisé de l'équipe LLVM:
"Transformez les boucles de prédicat en fonctions de prédicat"
Voir:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
la source
Attention: cette réponse montre une construction vraiment obscure.
Si vous utilisez GCC, consultez cette bibliothèque . Comme en PHP,
break
peut accepter le nombre de boucles imbriquées que vous souhaitez quitter. Vous pouvez écrire quelque chose comme ceci:la source
goto
effectivement :)goto
) est de loin préférable à asm en ligne (spécifique à la machine, plus facile à faire une erreur, plus difficile à lire, ...).la source
Si vous avez besoin des valeurs de i et j, cela devrait fonctionner mais avec moins de performances que les autres
la source
j
la valeur de la condition doit être stockée d'une manière ou d'une autre pour que cela fonctionne toujours.for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (workComplete[i][j]) break; /* do work */ workComplete[i][j] = true; } if (workComplete[i][j]) break; ... }
il sort toujours de la boucle externe après la première itération de la boucle interne.Va casser les deux boucles.
la source
la source
condition
devient faux. Oh, et la deuxième boucle fonctionnera pour toujours parce qu'elle incrémentei
au lieu dej
, oups ...la source