Suponha que eu tenha um loop em C ++ ou C # que seja assim:
while( true ) {
doSomething();
if( condition() ) {
break;
}
doSomethingElse();
}
Isso é comumente chamado de "loop infinito". No entanto, não é tecnicamente infinito - ele irá parar quando o controle fluir break
.
Qual é o termo para esse loop - que possui uma declaração de controle de loop "loop para sempre" e "quebra" dentro?
terminology
dente afiado
fonte
fonte
condition()
sempre retornar falso? Eu diria que é um loop infinito com quebras condicionais.break
, o loop não é infinito (kill
, ctrl-alt-del, desconecte ...). Então, por que se preocupar com os detalhes da terminologia?Respostas:
Estudando CS, esse professor nos ensinou que existem loops de verificação prévia (
while(cond) {}
), loops de verificação posterior (do {} while(cond);
) e loops de verificação média . (Talvez eu tenha traduzido mal para o inglês, mas você entendeu.)C e C ++ não possuem o último (ISTR Ada, BICBW); portanto, sua construção é usada para isso em C e C ++.
fonte
loop ... exit when condition; ... end loop;
O primeiro curso de CS em Stanford ( Metodologia de Programação por Mehran Sahami ) refere-se a isso como um ciclo e meio . E não é necessariamente uma prática ruim de programação. Considere este exemplo ao coletar informações do usuário (extraídas de The Art and Science of Java de Eric Roberts , onde Roberts também o chama de loop e meio ):
E então a mesma coisa resolvida usando a idéia de loop e meio para evitar código duplicado:
fonte
Na falta de um nome oficial, eu o chamaria de Broken Loop . A ambiguidade deste termo é pretendida, uma vez que uma interrupção no meio de um loop é um pouco impura, quase como a
goto
.fonte
goto
também tinha aplicativos válidos, por exemplo, emulação de uma tentativa ... finalmente bloqueia C.while(XEventGet(&ev) != NULL){ ... }
, você vai naturalmente querer verificar as chaves dentro do loop:if(ev.key == XK_q) break;
. Fazer o seguintewhile(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }
:, é feio e sem dúvida mais difícil de ler do que uma pausa no meio do ciclo. Além disso, e se algo precisar ser feito primeiro com o valor antes que possa ser verificado? Você não está seriamente colocando tudo isso no caso base do loop, não é?Não existe um nome definitivo. Loop infinito é, penso eu, o termo apropriado. Nenhum loop é verdadeiramente infinito, mas isso tem o potencial de ser efetivamente infinito, pois é possível que o ramo que contém a interrupção nunca ocorra.
Se você disser a alguém "crie um loop infinito e use uma pausa para a condição X", eles saberão o que você quer dizer. Se alguém estiver revisando seu código e disser nada mais do que "Não gosto do loop infinito que você escreveu", saberá do que eles estão falando (a menos que você tenha mais de um, é claro).
fonte
while
loop normal e a maneira como você faz a prova de finalização é exatamente a mesma (encontrar uma métrica monotonicamente decrescente é um ótimo começo).É um loop do-while com o condicional no lugar errado.
fonte
break
oucontinue
. Evite os valores das sentinelas a todo custo, eles são apenas mais um pedaço de estado arbitrário para acompanhar mentalmente, que disfarça o objetivo do código.Eu votaria em "loop incondicional" , semelhante ao "salto incondicional". Ele ilustra exatamente o que está acontecendo (o código faz um loop incondicionalmente), sem mentir (ao contrário de "loop infinito").
fonte
if
/break
no meio faz parte do padrão.É um loop infinito com uma condição de interrupção.
Eu concordo com ammilind que, se você quisesse dar um nome especial, poderia chamá-lo de Loop Parcial Infinito
fonte
No Código Rosetta, esse padrão específico é descrito como um loop "N mais meio" . Embora não seja meu termo favorito, não é terrível e é claramente um padrão útil para alguns tipos de loops. (As alternativas são duplicar o código antes da condição - potencialmente complicado em programas reais - ou aumentar a profundidade de aninhamento do código após a condição ao adicionar uma variável de condição de loop; nem melhorar a manutenção ou a compreensibilidade do código A única razão para rejeitar tais construções é se alguém insistir em escrever loops para ser
break
livre.)fonte
Não existe um termo padrão, mas eu diria isso como loop parcial .
Este loop é usado quando você deseja interromper apenas após executar uma parte do loop uma última vez (ou seja, execução parcial). É usado quando você não encontra uma situação adequada em que possa quebrar o loop inteiro .
Nesse caso, você deseja interromper o loop depois de executar pelo menos
doSomething()
uma última vez.fonte
Eu tenho que concordar com o sbi aqui - eu gosto do termo do loop de verificação do meio . Esse tipo de construção era mais popular quando a Programação Estruturada começou a rolar e muitos idiomas tinham suporte sintático para eles.
Dito isso, agora é amplo o conhecimento de que os
while
loops são geralmente mais sustentáveis, já que é mais fácil argumentar sobre invariantes e eles geralmente lidam melhor com o caso vazio complicado.No seu caso particular, seu loop é apenas equivalente a
então eu só iria usar a
break
versão se querdoSomething
oudoSomethingElse
envolvidas várias instruções e eu prefiro não guardá-los em funções distintas como você fez.Dito isto, se seu loop for mais complicado do que uma iteração (iniciar, verificar, incrementar), considere refatorá-lo para algo mais simples.
fonte
Acho que se tentarmos criar um termo para isso, talvez:
fonte
Eu chamo de o que é, um "loop while true".
Veja também se é uma prática de programação ruim (verdadeira)?
fonte
Não é tão ruim em todos os casos. Eu me pego escrevendo esse tipo de loops com certos tipos de APIs. Digamos, por exemplo, que você tenha um objeto de loop e precise verificar se há alguma condição profunda, como:
Agora, suponha que todo método getXXX possa retornar nulo. Ainda seria possível escrever uma expressão booleana, embora bastante complicada e ilegível. E então temos que refazer quase o mesmo para obter o objeto manipulador atual. Nesses casos, acho mais fácil escrever um
while (true)
loop com pausa e continuar.fonte