Есть ли способ разорвать вышестоящий цикл в C? - PullRequest
6 голосов
/ 07 ноября 2011

Предположим, у вас есть два вложенных цикла for:

int i, j;    // Iterators

for(i=0; i<100; ++i) {
     /* do some stuff */
     ...
     for(j=0; j<99; ++j) {
         /* do more stuff */
         ...
         if( someFunction(j,i) == 2 ) {
             /* break out of both loops */
         }
     }
}

Есть ли способ (похожий на команду break; в одном цикле) завершить оба цикла на месте?

Ответы [ 4 ]

13 голосов
/ 07 ноября 2011

Вы можете использовать goto как:

int i, j;    // Iterators

for(i=0; i<100; ++i) {
     /* do some stuff */
     ...
     for(j=0; j<99; ++j) {
         /* do more stuff */
         ...
         if( someFunction(j,i) == 2 ) {
             goto done;
         }
     }
}
done:

или использовать другую переменную для управления итерациями цикла:

int i, j;    // Iterators
int done = 0;
for(i=0; i<100 && !done; ++i) {
     /* do some stuff */
     ...
     for(j=0; j<99 && !done; ++j) {
         /* do more stuff */
         ...
         if( someFunction(j,i) == 2 ) {
             done = 1;
         }
     }
}
5 голосов
/ 07 ноября 2011

Наш хороший друг goto может с этим справиться!

int i, j;    // Iterators

for(i=0; i<100; ++i) {
     /* do some stuff */
     ...
     for(j=0; j<99; ++j) {
         /* do more stuff */
         ...
         if( someFunction(j,i) == 2 ) {
             /* break out of both loops */
             goto ExitLoopEarly;
         }
     }
}
goto ExitLoopNormal;

ExitLoopEarly:
....

ExitLoopNormal:
...
4 голосов
/ 07 ноября 2011

Это может быть решением

function void loop()
{
              int i, j;    // Iterators

            for(i=0; i<100; ++i) {
                 /* do some stuff */
                 ...
                 for(j=0; j<99; ++j) {
                     /* do more stuff */
                     ...
                     if( someFunction(j,i) == 2 ) {
                         return;
                     }
                 }
            }
}
0 голосов
/ 07 ноября 2011

Вы можете вставить два цикла в функцию и использовать return

void foo(){
int i, j;    // Iterators

for(i=0; i<100; ++i) {
     /* do some stuff */
     ...
     for(j=0; j<99; ++j) {
         /* do more stuff */
         ...
         if( someFunction(j,i) == 2 ) {
             return;
         }
     }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...