Est-il possible d'utiliser la break
fonction pour quitter plusieurs for
boucles imbriquées ?
Si oui, comment feriez-vous cela? Pouvez-vous également contrôler le nombre de boucles des break
sorties?
c++
for-loop
break
nested-loops
Faken
la source
la source
Réponses:
AFAIK, C ++ ne prend pas en charge les boucles de dénomination, comme Java et d'autres langages. Vous pouvez utiliser un goto ou créer une valeur d'indicateur que vous utilisez. À la fin de chaque boucle, vérifiez la valeur du drapeau. S'il est défini sur true, vous pouvez sortir de cette itération.
la source
goto
si c'est la meilleure option.goto
: les mauvais programmeurs et les programmeurs pragmatiques. Les premiers sont explicites. Ce dernier, dans lequel vous vous situeriez si vous choisissez de bien les utiliser, utilise un concept dit "maléfique" lorsqu'il s'agit du moindre de (deux) maux. Lisez ceci pour une meilleure compréhension de certains concepts C ++ que vous devrez peut-être utiliser de temps en temps (macros, goto, préprocesseur, tableaux): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
rarement la meilleure option. Pourquoi ne pas mettre les boucles dans leur propre fonction (inline
, si vous êtes préoccupé par la vitesse) et àreturn
partir de là?Non, ne le gâte pas avec un
break
. Il s'agit du dernier bastion restant à l'usage degoto
.la source
Juste pour ajouter une réponse explicite en utilisant lambdas:
Bien sûr, ce modèle a certaines limites et évidemment C ++ 11 uniquement, mais je pense qu'il est très utile.
la source
Une autre approche pour sortir d'une boucle imbriquée consiste à factoriser les deux boucles dans une fonction distincte et à
return
partir de cette fonction lorsque vous souhaitez quitter.Bien sûr, cela soulève l'autre argument de savoir si vous devez jamais explicitement à
return
partir d'une fonction ailleurs qu'à la fin.la source
continue_processing
) qui contrôlaient l'exécution de blocs de code plus bas dans la fonction.Pause ne quittera que la boucle la plus intérieure qui le contient.
Vous pouvez utiliser goto pour sortir de n'importe quel nombre de boucles.
Bien sûr, goto est souvent considéré comme nuisible .
L'utilisation de break and goto peut rendre plus difficile de raisonner sur l'exactitude d'un programme. Voir ici pour une discussion à ce sujet: Dijkstra n'était pas fou .
la source
break
oureturn
.break
et vousreturn
avez l'avantage degoto
ne pas avoir à chercher une étiquette pour trouver où ils vont. Oui, en dessous, ils sont en quelque sortegoto
, mais très restreints. Ils sont beaucoup plus faciles à déchiffrer par le cerveau d'appariement de motifs d'un programmeur que par le libregoto
. Donc, l'OMI, ils sont préférables.goto
.Bien que cette réponse ait déjà été présentée, je pense qu'une bonne approche consiste à procéder comme suit:
la source
gotoMainLoop
est vérifié à chaque cyclegoto
rend le noyau plus lisible et plus performant.Que dis-tu de ça?
la source
Un exemple de code utilisant
goto
et une étiquette pour sortir d'une boucle imbriquée:la source
Une bonne façon de sortir de plusieurs boucles imbriquées est de refactoriser votre code en fonction:
la source
goto peut être très utile pour casser des boucles imbriquées
la source
de msdn .
la source
Je pense qu'un
goto
est valable dans cette circonstance:Pour simuler un
break
/continue
, vous souhaitez:Pause
Continuer
la source
i
. D'oùi++
avant le gotoD'autres langages tels que PHP acceptent un paramètre pour break (c'est-à-dire break 2;) pour spécifier la quantité de niveaux de boucles imbriquées dont vous voulez sortir, mais C ++ ne le fait pas. Vous devrez le résoudre en utilisant un booléen que vous définissez sur false avant la boucle, défini sur true dans la boucle si vous voulez rompre, plus une pause conditionnelle après la boucle imbriquée, vérifiant si le booléen a été défini sur true et casse si oui.
la source
Je sais que c'est un ancien poste. Mais je proposerais une réponse un peu logique et plus simple.
la source
j = conditionj
cela ne fonctionnera pas si vous avez un prédicat complexe à la place dej < conditionj
.Brisez n'importe quel nombre de boucles par une seule
bool
variable, voir ci-dessous:Dans ce code, nous avons
break;
toutes les boucles.la source
Je ne sais pas si cela en vaut la peine, mais vous pouvez émuler les boucles nommées de Java avec quelques macros simples:
Exemple d'utilisation:
Un autre exemple:
la source
la source
Vous pouvez utiliser try ... catch.
Si vous devez sortir de plusieurs boucles à la fois, c'est souvent une exception de toute façon.
la source
Sortir d'une boucle for est un peu étrange pour moi, car la sémantique d'une boucle for indique généralement qu'elle s'exécutera un nombre spécifié de fois. Cependant, ce n'est pas mauvais dans tous les cas; si vous recherchez quelque chose dans une collection et que vous souhaitez vous casser après l'avoir trouvé, c'est utile. Il n'est cependant pas possible de sortir des boucles imbriquées 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 la nuit ..? Cela semble être la meilleure option.
la source