74 votes

Comment puis-je sortir de deux boucles imbriquées dans Objective-C?

J'ai deux boucles imbriquées comme ceci:

 for(...) {
    for(...) {

    }
}
 

Je sais qu'il y a une déclaration break . Mais je ne sais pas si ça casse les deux boucles ou juste celle dans laquelle on l’appelle? Je dois casser les deux dès que je vois qu'il est insensé de répéter plusieurs fois.

106voto

Ori Pessach Points 4957

Si goto simplifie le code, alors ce serait approprié.

 for (;;) 
{
    for (;;) 
    {
        break; /* breaks inner loop */
    } 
    for (;;) 
    {
        goto outer; /* breaks outer loop */
    }
} 
outer:;
 

92voto

zilupe Points 2137

break rompt une boucle, mais vous pouvez ajouter une vérification à la boucle externe qui se rompt lorsque l’intérieur se casse.

 bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
   for ( ... ) {
      if (...) {
         dobreak = true;
         break;
      }
   }
}
 

14voto

unwind Points 181987

La déclaration break vous permet uniquement de sortir de la boucle la plus intérieure. Si vous ne voulez pas la surcharge de code, de mémoire et de performances d'une variable d'état dédiée, je vous recommande de refactoriser le code dans une fonction ou une méthode qui lui est propre, et d'utiliser return pour sortir de tout les boucles:

 void do_lots_of_work(void)
{
  int i, j;

  for(i=0; i<10 ; i++)
  {
    for(j=0;j< 10; j++)
    {
     ..
     ..
     if(disaster_struck())
      return; /* Gets us out of the loops, and the function too. */
    }
  }
}
 

9voto

lothar Points 11904

Autre que la variable drapeau a déjà été mentionné ou goto vous pourriez jeter un objectif-C exception :

7voto

Caffeine Coma Points 10544

D’autres ont mentionné comment vous pouvez définir un indicateur ou utiliser un , mais je recommanderais refactorisation votre code afin que la boucle intérieure est transformée en une méthode distincte. Que méthode peut retourner ensuite un drapeau pour indiquer que la boucle externe doit . Si vous nommez vos méthodes convenablement, c’est beaucoup plus lisible.

Pseudocode, ne pas testé, mais vous voyez l’idée.

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