428 votes

Puis-je utiliser break pour sortir de plusieurs boucles 'for' imbriquées ?

Est-il possible d'utiliser le break pour sortir de plusieurs fonctions imbriquées for des boucles ?

Dans l'affirmative, comment vous y prendriez-vous ? Pouvez-vous également contrôler le nombre de boucles que le break les sorties ?

11 votes

Au lieu d'utiliser break ou goto pour sortir de plusieurs boucles imbriquées, vous pouvez enfermer cette logique particulière dans une fonction et utiliser return pour sortir de plusieurs boucles imbriquées. Cela préservera l'esthétique de votre code et vous évitera d'utiliser goto, qui est une mauvaise pratique de programmation.

357voto

Henk Holterman Points 153608

Non, ne gâchez pas tout avec un break . Il s'agit du dernier bastion restant pour l'utilisation de goto .

39 votes

La norme de codage MISRA C++ autorise l'utilisation de goto pour couvrir ce type de situation.

41 votes

Les vrais programmeurs n'ont pas peur d'utiliser goto. Je l'ai fait pendant 25 ans -- aucun regret -- j'ai économisé une tonne de temps de développement.

4 votes

Je suis d'accord. Les gotos sont indispensables si vous n'avez pas 8K pixels de travers, et si vous devez appeler une séquence de 30 appels au système d'exploitation Windows.

298voto

Cullen Walsh Points 1823

A ma connaissance, le C++ ne prend pas en charge les boucles de nommage, comme le font Java et d'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 vraie, vous pouvez sortir de cette itération.

394 votes

N'ayez pas peur d'utiliser un goto si c'est la meilleure option.

29 votes

Je suis un nouveau programmeur C++ (et je n'ai pas reçu de formation formelle en programmation) et j'ai lu des articles sur le goto. J'hésite à l'utiliser de peur que mon programme n'explose soudainement et ne me tue. En dehors de cela, lorsque j'avais l'habitude d'écrire des programmes sur mon ti-83 (dans des cours de mathématiques ennuyeux bien sûr), les fonctions de l'éditeur de base fournies nécessitaient l'utilisation de goto.

2 votes

Je crois me souvenir avoir lu que de nombreux compilateurs renoncent à optimiser les boucles lorsqu'un goto est présent...

63voto

Greg Hewgill Points 356191

Une autre approche pour sortir d'une boucle imbriquée consiste à factoriser les deux boucles dans une fonction séparée, et return de cette fonction lorsque vous voulez sortir.

Bien sûr, cela soulève l'autre question de savoir si vous devez explicitement return d'une fonction n'importe où ailleurs qu'à la fin.

8 votes

C'est un problème C. Avec la RIAA, le retour anticipé n'est pas un problème car tous les problèmes liés au retour anticipé sont correctement gérés.

5 votes

Je comprends qu'une application correcte du RIAA peut résoudre le problème du nettoyage des ressources en C++, mais j'ai vu l'argument philosophique contre le retour anticipé se poursuivre dans d'autres environnements et langages. Un système sur lequel j'ai travaillé et où la norme de codage interdisait le retour anticipé avait des fonctions truffées de variables booléennes (avec des noms comme continue_processing ) qui contrôlaient l'exécution de blocs de code plus bas dans la fonction.

32 votes

Qu'est-ce que la RIAA ? Est-ce que ça ressemble à RAII ? =D

38voto

Karl Voigtland Points 5111

romper ne quittera que la boucle la plus interne qui le contient.

Vous pouvez utiliser goto pour sortir d'un certain nombre de boucles.

Bien sûr. goto est souvent Considéré comme nuisible .

est-il correct d'utiliser la fonction break [...] ?

L'utilisation de break et goto peut rendre plus difficile le raisonnement sur l'exactitude d'un programme. Voir ici pour une discussion à ce sujet : Dijkstra n'était pas fou .

22 votes

Une bonne réponse dans la mesure où elle explique que le mème "goto is harmful" est fortement lié à l'affirmation plus généralisée "control flow interruption is harmful". Il n'y a pas de sens à dire "goto est nuisible", puis à se retourner et à recommander l'utilisation de break ou return .

7 votes

@Pavel : break et return ont l'avantage sur goto que vous n'avez pas besoin de chercher une étiquette pour savoir où ils vont. Oui, en dessous, ils sont une sorte de goto mais de façon très restreinte. Ils sont beaucoup plus faciles à déchiffrer par le cerveau d'un programmeur que le modèle non restreint goto . Ils sont donc préférables.

2 votes

@sbi : C'est vrai, mais break ne fait toujours pas partie de la programmation structurée. Il est juste mieux toléré qu'un goto .

21voto

inf.ig.sh Points 716

Bien que cette réponse ait déjà été présentée, 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;
        }
    }

}

6 votes

Ce qui est bien mais pas encore très lisible, je préfère goto dans ce cas là

4 votes

Cela rend votre code "assez" lent parce que les gotoMainLoop est vérifié à chaque cycle

5 votes

Dans ce cas, l'utilisation du réel goto rend le noyau plus lisible et plus performant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X