Se eu usar uma break
instrução, ela só quebrará o loop interno e preciso usar algum sinalizador para quebrar o loop externo. Mas se houver muitos loops aninhados, o código não terá uma boa aparência.
Existe alguma outra maneira de quebrar todos os loops? (Por favor, não use goto stmt
.)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
c
nested-loops
break
user966379
fonte
fonte
Respostas:
Usar:
fonte
const int count =1000
, na inicialização global. ou como uma#define
macro.Não, não estrague a diversão com um
break
. Este é o último uso válido restante degoto
;)Do contrário, você pode usar sinalizadores para quebrar loops aninhados profundos.
Outra abordagem para quebrar um loop aninhado é fatorar ambos os loops em uma função separada e retornar dessa função quando quiser sair.
Resumido - para quebrar os loops aninhados:
goto
Não pude resistir a incluir xkcd aqui :)
fonte
Goto's são considerados prejudiciais, mas como muitas pessoas nos comentários sugerem que não precisa ser. Se usado com cautela, pode ser uma ótima ferramenta. Qualquer coisa usada com moderação é divertida.
fonte
fonte
Uma maneira é colocar todos os loops aninhados em uma função e retornar do loop mais interno no caso de uma necessidade de quebrar todos os loops.
fonte
Acho que
goto
vai resolver o problemafonte
Você precisará de uma variável booleana, se quiser que seja legível:
Se você quiser menos legível, pode participar da avaliação booleana:
Por fim, você pode invalidar o loop inicial:
fonte
Use este conselho sábio da equipe LLVM:
"Transforme Loops de Predicado em Funções de Predicado"
Vejo:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
fonte
Cuidado: esta resposta mostra uma construção realmente obscura.
Se você estiver usando o GCC, verifique esta biblioteca . Como no PHP,
break
pode aceitar o número de loops aninhados que você deseja sair. Você pode escrever algo assim:fonte
goto
:)goto
) é muito preferível para asm inline (específico da máquina, mais fácil de cometer um erro, mais difícil de ler, ...).fonte
Se você precisa dos valores de i e j, isso deve funcionar, mas com menos desempenho do que outros
fonte
j
, o valor da condição precisa ser armazenado de alguma forma para que ainda funcione.for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (workComplete[i][j]) break; /* do work */ workComplete[i][j] = true; } if (workComplete[i][j]) break; ... }
vai sempre sair da espira externa depois da primeira iteração do circuito interno.Irá quebrar ambos os loops.
fonte
fonte
condition
se tornar falso. Ah, e o segundo loop será executado para sempre porque é incrementado emi
vez dej
,fonte