web-dev-qa-db-fra.com

Puis-je utiliser break pour quitter plusieurs boucles imbriquées?

Est-il possible d'utiliser la fonction break pour quitter plusieurs boucles for imbriquées? Si oui, comment vous y prendriez-vous? Pouvez-vous également contrôler le nombre de boucles de sorties de pause?

277
Faken

Autant que je sache, 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 définie sur true, vous pouvez sortir de cette itération.

220
Cullen Walsh

Non, ne le gâtez pas avec un break. C'est le dernier bastion restant pour l'utilisation de goto.

252
Henk Holterman

Une autre approche pour rompre 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, ceci soulève l'autre argument, à savoir si vous devriez ou non explicitement return partir d'une fonction ailleurs qu'à la fin.

53
Greg Hewgill

Juste pour ajouter 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 limites et, bien évidemment, uniquement le C++ 11, mais je pense qu’il est très utile.

52
Predelnik

break ne sortira que de la boucle la plus interne qui la contient.

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

Bien sûr goto est souvent considéré comme nocif .

est-il approprié d'utiliser la fonction pause [...]?

Utiliser break et goto peut rendre plus difficile la raison de l'exactitude d'un programme. Voir ici pour une discussion à ce sujet: Dijkstra n’était pas fo .

32
Karl Voigtland

Bien que cette réponse ait déjà été présentée, je pense qu’une bonne approche consiste à procéder comme 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;
        }
    }

}
21
inf.ig.sh

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;
            }
        }
    }
}
18
jebeaudet

Un exemple de code utilisant goto et une étiquette pour sortir d'une boucle imbriquée:

for (;;)
  for (;;)
    goto theEnd;
theEnd:
15
Helio Santos

Un bon moyen de sortir de plusieurs boucles imbriquées est de refactoriser 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;
            }
        }
    }
}
9
Deqing

goto peut être très utile pour casser des boucles imbriquées

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
5
Azeemali Hashmani

L'instruction break termine l'exécution de l'instruction do, for, switch ou while la plus proche dans laquelle elle apparaît. Le contrôle passe à l'instruction qui suit l'instruction terminée.

de msdn .

3
Rob

Je pense qu'un goto est valide dans ce cas:

Pour simuler une break/continue, vous souhaitez:

Pause

for ( ;  ;  ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            goto theEnd;
        }
    }
}
theEnd:

Continuez

for ( ;  ; ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            i++;
            goto multiCont;
        }
    }
    multiCont:
}
2
JadeMaveric

D'autres langages tels que PHP acceptent un paramètre pour break (c'est-à-dire break 2;) pour spécifier le nombre de niveaux de boucle imbriqués dont vous souhaitez sortir, mais pas C++. Vous devrez résoudre le problème en utilisant un booléen que vous avez défini sur false avant la boucle, sur true dans la boucle si vous souhaitez rompre, plus un saut conditionnel après la boucle imbriquée, en vérifiant si le booléen est défini sur true. et pause si oui.

0
Patrick Glandien

Je sais que c'est vieux post. Mais je suggérerais une réponse un peu 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;
            }
        }
    }
0
Aditya Jagtap

Casser n'importe quel nombre de boucles d'une seule variable bool, voir ci-dessous:

bool check = true;

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)
            {
                check = false;
                break;
            }
        }
        if (!check)
        {
            break;
        }
    }
    if (!check)
    {
        break;
    }
}

Dans ce code, nous break; toutes les boucles.

0
vikas bansal