Nos meus tempos de C / C ++, codificar um "loop infinito" como
while (true)
parecia mais natural e parecia mais óbvio para mim do que
for (;;)
Um encontro com o PC-lint no final dos anos 1980 e as discussões subsequentes sobre as melhores práticas me quebraram desse hábito. Desde então, codifiquei os loops usando a for
instrução de controle. Hoje, pela primeira vez em muito tempo, e talvez minha primeira necessidade de um loop infinito como desenvolvedor C #, estou enfrentando a mesma situação. Um deles está correto e o outro não?
c#
infinite-loop
Bob Kaufman
fonte
fonte
while(true)
requer uma condição.for(;;)
é, portanto, uma representação melhor para loops infinitos que se repetem incondicionalmente. 2. Compiladores antigos não otimizados podem realmente ter avaliado o(true)
enquanto ele fazia um loop. 3. C é uma linguagem minimalista da época dos teletipos, terminais de 300 baud e nomes de variáveis de 1 caractere. Em um ambiente onde cada toque de tecla conta,for(;;)
é um pouco mais curto do quewhile(true)
.Respostas:
É sempre o que eu usei e o que vi outras pessoas usarem para um loop que tem que ser quebrado manualmente.
fonte
O compilador C # irá transformar ambos
e
para dentro
O CIL para ambos é o mesmo. A maioria das pessoas acha
while(true)
que é mais fácil de ler e compreender.for(;;)
é bastante enigmático.Fonte:
Eu baguncei um pouco mais com o .NET Reflector e compilei os dois loops com o "Optimize Code" ativado no Visual Studio.
Ambos os loops são compilados (com .NET Reflector):
Raptors devem atacar em breve.
fonte
goto
instrução, aliás, o que não é nenhuma surpresa.goto LOOP
é o loop infinito C # correto :)Acho que isso pode ser mais fácil de ler e é definitivamente o padrão para uso em C #:
fonte
while(1)
não é válido em C #, pois1
não é umbool
.Gasp, use:
OU, como jsight apontou, você pode querer ter certeza absoluta :
Antes que as pessoas gritem comigo, é tudo o mesmo código CIL, eu verifiquei :)
fonte
Para relembrar algumas piadas antigas:
for (;;) {}
" - isso faz a declaração chorar.#define EVER ;;
".fonte
#define ever (;;)
que eu acho mais legível.for ever {}
#define forever while(true)
Se você quiser ir para a escola antiga, goto ainda é compatível com C #:
Para um loop verdadeiramente infinito, este é o comando go-to. =)
fonte
Eu acho que
while (true)
é um pouco mais legível.fonte
Nas situações em que precisava de um verdadeiro loop infinito, sempre usei
Parece expressar melhor a intenção do que uma declaração vazia para.
fonte
Pessoalmente, sempre preferi
for(;;)
precisamente porque não tem nenhuma condição (ao contrário dewhile (true)
que tem uma sempre verdadeira). No entanto, este é realmente um ponto de estilo muito menor, sobre o qual não acho que valha a pena discutir. Ainda estou para ver uma diretriz de estilo C # que obrigue ou proíba qualquer abordagem.fonte
while
". No que diz respeito ao programador, o compilador transforma o código de alto nível em IL. Não háwhile
(oufor
) loops em IL, apenas rótulos e gotos.Eu pessoalmente prefiro o
for (;;)
idioma (vindo de um ponto de vista C / C ++). Embora eu concorde que owhile (true)
é mais legível em certo sentido (e é o que eu costumava usar quando ainda em C / C ++), comecei a usar ofor
idioma porque:Acho que o fato de um loop não terminar (de uma forma normal) vale a pena 'chamar', e acho que
for (;;)
faz isso um pouco mais.fonte
for
emwhile
. Para ambosfor (;;){}
ewhile (true){}
, ele gera um novowhile(true){}
código. Veja esta resposta .O livro K&R original para C, a partir do qual C # pode traçar sua ancestralidade, recomendava
para loops infinitos. É inequívoco, fácil de ler e tem uma longa e nobre história por trás dele.
Adendo (fevereiro de 2017)
Claro, se você acha que esta forma de loop (ou qualquer outra forma) é muito enigmática, você pode apenas adicionar um comentário .
Ou:
fonte
Deve ser
while(true)
nãowhile(1)
, entãowhile(1)
é incorreto em C #, sim;)fonte
Alternativamente, pode-se dizer que ter um loop infinito normalmente é uma prática ruim, pois é necessária uma condição de saída, a menos que o aplicativo seja executado para sempre. No entanto, se isso for para um míssil de cruzeiro, aceitarei que uma condição de saída explícita pode não ser necessária.
Embora eu goste deste:
fonte
f < 16777217f
é semprefalse
... então isso nunca faz loop.Eu prefiro um código um pouco mais "letrado". Tenho muito mais probabilidade de fazer algo assim na prática:
fonte
do ... while()
laço disfarçado. Levei apenas alguns segundos para ver isso. Se você tivesse escrito umdo ... while()
loop, teria ficado claro imediatamente. -1break
.Até eu também digo que o abaixo é melhor :)
fonte
Se você está jogando golfe, eu sugiro
for(;;)
. Além disso,while(true)
tem o mesmo significado e parece mais intuitivo. De qualquer forma, a maioria dos programadores provavelmente entenderá ambas as variações, então isso realmente não importa. Use o que for mais confortável.fonte
A única razão pela qual eu diria
for(;;)
é devido às limitações do CodeDom (enquanto os loops não podem ser declarados usando CodeDom e os loops for são vistos como a forma mais geral de um loop de iteração).Esta é uma razão muito vaga para escolher isso, além do fato de
for
implementação loop pode ser usada tanto para código normal quanto para código gerado pelo CodeDom. Ou seja, pode ser mais padrão.Como observação, você pode usar trechos de código para criar um
while
loop, mas o loop inteiro precisa ser um trecho ...fonte
Ambos têm a mesma função, mas geralmente as pessoas preferem
while(true)
. Parece fácil de ler e entender ...fonte
Qualquer expressão que sempre retorna verdadeiro deve ser OK para o loop while.
Exemplo:
fonte
Em termos de legibilidade do código
while(true)
em qualquer linguagem que eu sinta que faz mais sentido. Em termos de como o computador o vê, realmente não deveria haver nenhuma diferença na sociedade atual de compiladores e interpretadores muito eficientes.Se houver alguma diferença de desempenho, tenho certeza de que a tradução para MSIL será otimizada. Você poderia verificar se realmente quisesse.
fonte