"For (;;)" é mais rápido que "while (TRUE)"? Se não, por que as pessoas o usam?


164
for (;;) {
    //Something to be done repeatedly
}

Já vi esse tipo de coisa ser muito usada, mas acho que é bastante estranho ... Não seria muito mais claro dizer while(true)algo assim?

Estou supondo que (como é o motivo de muitos programadores recorrerem a códigos enigmáticos) essa é uma margem minúscula mais rápida?

Por que e realmente vale a pena? Se sim, por que não apenas defini-lo desta maneira:

#define while(true) for(;;)

Veja também: O que é mais rápido: while (1) ou while (2)?


51
O que é TRUE???
AnT

20
@ Steven Sudit: O que TRUEtem a ver com C? A macro padrão para o verdadeiro resultado de boolen em C99 ainda é true. De onde TRUEveio isso?
AnT

31
Essa macro não funciona, #define EVER ;;tem sido utilizado em IOCCC embora .. :)

18
Não é essa macro para #define while(TRUE)declarar uma macro que usa um argumento chamado TRUEque nunca é usado, portanto, transformando cada loop while do seu programa em um loop infinito?
AshleysBrain

9
@ Steven Sudit: Não. Não há "macro padrão no VS 6.0". A macro TRUEvem dos arquivos de cabeçalho associados à API do Windows. Não está relacionado ao VS 6.0 de forma alguma. E, como eu disse antes, não tem nada a ver com C ou C ++. No C ++, o literal "true" é justo true(no VS 6.0 também), no C89 / 90 não existe tal coisa e no C99 é macro true. Isso se aplica a todos os compiladores C / C ++.
quer

Respostas:


262
  1. Não é mais rápido.
  2. Se você realmente se importa, compile com a saída do assembler para sua plataforma e veja.
  3. Não importa. Isso nunca importa. Escreva seus loops infinitos como quiser.

227
Intuitivamente, a otimização de um loop infinito oferece o potencial de velocidade infinita. Ainda bem que não programamos sobre intuição. :-)
Steven Sudit 9/04/10

5
Suponho que você esteja certo. Eu acho que estava envolvido em debates "religiosos" sobre pequenas coisas. Obrigado por sacudir minha consciência. : D
Chris Cooper

6
@ Steven LOL, isso é interessante, mas considere que o único cenário em que você realmente alcançou esse potencial de velocidade infinita é quando o loop nunca quebra e realmente roda infinitamente, o que provavelmente é um bug ou, se pretendido, será uma espera infinita antes de atingir esse potencial.
AaronLS

7
@Chris. Na programação e na vida, os debates religiosos valem o seu tempo apenas para coisas que realmente importam. Isso simplesmente não é uma dessas coisas. Como você pode ver, todo mundo tem um jeito de escrever um loop sem fim. Escolha por si mesmo o que o torna mais feliz pelas pequenas coisas e, em seguida, execute seu criador de perfil no código que importa. :)
Ben Zotto 10/04

3
Isso importava, já que alguns compiladores antigos em algumas plataformas carregavam uma constante e fizeram um salto condicional nela. Naqueles dias, o hardware importava.
Peterchen

176

Eu prefiro for(;;)por duas razões.

Uma é que alguns compiladores produzem avisos while(true)(algo como "condição de loop é constante"). Evitar avisos é sempre uma boa coisa a fazer.

Outra é que eu acho for(;;) mais claro e revelador. Eu quero um loop infinito. Literalmente não tem condição, não depende de nada. Eu só quero que continue para sempre, até que eu faça algo para sair disso.

Considerando que while(true), bem, o que é verdade tem a ver com alguma coisa? Não estou interessado em fazer loop até que true se torne falso, que é o que esta forma literalmente diz (faça loop enquanto true for verdadeiro). Eu só quero fazer um loop.

E não, não há absolutamente nenhuma diferença de desempenho.


73
+1 para evitar avisos. Mas, quanto à clareza, acho mais claro do que neste contexto. Eu acho que esse aspecto se resume apenas à preferência pessoal.
Tim

14
Sim, preferência e hábito. Se você não está acostumado a ver for(;;), obviamente isso parecerá estranho. Mas eu recomendo tentar se acostumar com isso, porque é um idioma comum, e você o encontrará novamente. ;)
jalf

7
O comentário de jalf sobre ser idiomático é realmente a resposta aqui. É comumente usado para "loop infinito" simplesmente porque é a maneira mais comum de escrever "loop infinito" em C. Não precisa haver uma boa razão para um idioma - é apenas uma convenção de auto-reforço.
caf

7
@ Steve: Eu não vejo por que eu nunca usar for(;condition;). Isso é o que um loop while é para . Mas, como eu disse, com um loop infinito, não quero que o compilador compare nenhuma condição. Ingenuamente, com um whileloop, ele teria que testar truetodas as iterações (obviamente, nem mesmo o compilador mais idiota faria isso, mas é o princípio que me incomoda. Parece-me que superespecificamos seu código), enquanto com um for(;;)você está literalmente dizendo "não há condição para testar. Apenas faça um loop". Acho que é o mais próximo equivalente ao seu imaginárioloop {...}
jalf

32
Seu compilador é péssimo se while(true)der um aviso.
Albert

56

Pessoalmente, eu uso for (;;)porque não há números, é apenas uma palavra-chave. I preferem a while (true), while (1), while (42), while (!0)etc etc.


38
0, 1 e infinito são números mágicos aceitáveis, estendendo 0 e 1 a falso e verdadeiro não é uma perda. truenão é mais um número mágico do que foruma palavra-chave mágica ou que for(;;)usa um infinito mágico implícito. ( while (42)É de facto abominável.)

38
Tangente: um dos meus professores de CS disse que "existem apenas três números na programação: 0, 1 e n. Qualquer outra coisa é chamada de número mágico".
21710 Ben Zotto

21
while (42) é o mais legal, não produz resultados diferentes em relação a while (1) ou while (true) ou while (! 0), e tem significado filosófico . Suponho que for(;;)é analisado mais rápido do que os outros de qualquer maneira
ShinTakezou

2
@ShinTakezou very better to #define LIFE 42 while (LIFE):)
mr5

1
O poço while(true)também não contém nenhum número. e para (;;) não é uma palavra
RiaD

49

Por causa de Dennis Ritchie

  • Comecei a usar for (;;)porque é assim que Dennis Ritchie o faz em K&R e, ao aprender um novo idioma, sempre tento imitar os caras espertos.

  • Isso é C / C ++ idiomático. Provavelmente, a longo prazo, é melhor se acostumar com isso, se você planeja fazer muito no espaço C / C ++.

  • Você #definenão funcionará, já que a coisa que está sendo definida deve se parecer com um identificador C.

  • Todos os compiladores modernos geram o mesmo código para as duas construções.


10
Sim, é assim que você sabe que alguém aprendeu C com K&R, da maneira que deve ser aprendido. Sempre que vejo while(TRUE), suspeito que o programador seja um novato em C ou aprendi C em um livro para leigos.
Kristopher Johnson

13
Ouvi dizer que esses novatos também usam o estilo de definição de função newfangled .
23613 Justin

46

Certamente não é mais rápido em nenhum compilador são. Ambos serão compilados em saltos incondicionais. A versão for é mais fácil de digitar (como Neil disse) e ficará clara se você entender a sintaxe do loop.

Se você está curioso, aqui está o que o gcc 4.4.1 me fornece para x86. Ambos usam a instrução x86 JMP .

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

compila para (em parte):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

Duvido que seja mais rápido, mesmo no modo de depuração.
Steven Sudit 9/04

106
for_infiniteé mais rápido; 2 caracteres a menos para puts.
Dave Jarvis

43

Eu prefiro for (;;)porque é o mais consistente em diferentes idiomas do tipo C.

Em C ++ while (true)é bom, mas em C você depende de um cabeçalho para definir true, mas também TRUEé uma macro comumente usada. Se você usá- while (1)lo, está correto em C e C ++ e JavaScript, mas não em Java ou C #, que exigem que a condição do loop seja booleana, como while (true)ou while (1 == 1). No PHP, as palavras-chave não diferenciam maiúsculas de minúsculas, mas o idioma prefere a capitalização TRUE.

No entanto, for (;;)sempre está completamente correto em todos esses idiomas.


9
Obrigado pela sua resposta! Eu acho que esta é realmente a primeira resposta que mostra uma maneira objetiva que for (;;)é melhor.
Chris Cooper

8
Acho que nunca precisei escrever código correto em C, C ++, JavaScript, Java e C #. Eles são idiomas diferentes.
21414 Keith Thompson

6
@KeithThompson não se trata de escrever código correto em muitos idiomas; Eu acho que é sobre evitar interpretações erradas entre desenvolvedores com diferentes origens.
Mauro Sampietro

6
@ sam: Ambos while (1)e for (;;)são expressões comuns para loops infinitos em C. Qualquer pessoa que esteja lendo um programa em C que tenha problemas para entender ou provavelmente terá problemas com o restante do código. Não é útil para escrever código C que pode ser facilmente lido por alguém que não sabe C.
Keith Thompson

6
@KeithThompson Embora um leitor competente de C deva estar familiarizado com os dois idiomas, isso também pode ser útil se o escritor for um programador poliglota. No meu último trabalho, trabalhei em JS, ActionScript e PHP diariamente, e unificar a maneira como se escreve código (onde faz sentido fazê-lo) pode tornar a programação mais rápida e a manutenção mais fácil.
Ionoclast Brigham

21

Pessoalmente, prefiro o for (;;)idioma (que será compilado com o mesmo código que while (TRUE).

Usando while (TRUE)pode ser mais legível em um sentido, eu decidi usar o for (;;)idioma porque ele se destaca .

Uma construção de loop infinito deve ser facilmente percebida ou destacada no código, e eu pessoalmente acho que o for (;;)estilo faz isso um pouco melhor que while (TRUE)ou while (1).

Além disso, lembro que alguns compiladores emitem avisos quando a expressão de controle de um loop while é uma constante. Não acho que isso aconteça demais, mas apenas o potencial de avisos falsos é suficiente para que eu queira evitá-lo.


17

Eu já vi algumas pessoas preferirem porque têm um #define em algum lugar como este:

#define EVER ;;

O que lhes permite escrever isso:

for (EVER)
{
    /* blah */
}

24
Eu também vi isso; mas não é uma boa razão para preferir. Como mantenedor, você ainda precisa verificar a definição da macro para ter certeza de que fez o que esperaria, enquanto o código original era claro o suficiente. O RTOS VxWorks tem uma macro FOREVERdefinida for(;;), mas isso não é melhor. As macros da IMO não devem ser usadas para 'inventar' um novo idioma.
Clifford

8
Na verdade, o objetivo das macros em alguns idiomas é inventar uma nova sintaxe. Mas independentemente 'para (SEMPRE)' em C / C ++ é hediondo.
Dan Olson

15
Algumas pessoas fazem coisas engraçadas, como se gostam de Pascal, dizem #define BEGIN {e #define END }. Eu já vi #define DONKEYS_FLY (0)isso para que eles possam dizer if DONKEYS_FLY .... Quem disse que o software é chato?
Mike Dunlavey

11
Na Califórnia, eu acredito que você tem que #define para (;;) LIKE_FOREVER
Martin Beckett

1
Eu não pude resistir: #define never while(0)e#define always
ALFC

16

E se (se o seu idioma suportar):

start:
/* BLAH */
goto start;

... que deve gerar uma saída idêntica nas mãos de qualquer compilador razoável.
Ben Zotto

9
+1! Não melhora gotoas inúmeras desvantagens, mas, se o algoritmo que você está tentando implementar vier de um fluxograma, essa é a tradução mais direta.
Edmund

4
Pessoalmente, tenho uma visão utilitarista sobre o goto. Não há raptores. Os raptores são pessoas. E foram as pessoas que começaram a usar o goto para criar código de espaguete. Além disso, a saída montada para um loop se parece com isso. Os conjuntos de instruções para computadores não têm conceitos de "para" ou "enquanto", apenas "pular".
josaphatv

nunca nunca usargoto
Edward Karak

O mais legal gotoé que você não precisa se preocupar com alguém adicionando um breakpara tornar seu loop menos infinito. (a menos que você já está dentro de outro whileou forlaço é claro ...)

12

Não há diferença em termos do código de máquina que é gerado.

No entanto, apenas para reverter a tendência, eu argumentaria que a forma while (TRUE) é muito mais legível e intuitiva do que para (;;), e que legibilidade e clareza são razões muito mais importantes para diretrizes de codificação do que quaisquer outras razões pelas quais eu ' ouvi falar da abordagem for (;;) (prefiro basear minhas diretrizes de codificação em raciocínio sólido e / ou prova de eficácia).


6
Isso depende do seu idioma. for(;;)é a maneira tradicional de fazer isso em C e C ++. while(true)parece ser a convenção em C # e Java e outras linguagens. Sua milhagem pode variar.
Billy ONeal

9
Sim, e alguém que não conhece muito bem o C ou o C ++ pode achar STRING_SCAN_FORMATTED mais legível que o sscanf, mas você não vê ninguém colocando #define STRING_SCAN_FORMATTED sscanf no topo do código.
ta.speot.is

4
Eu diria que a maneira idiomática de fazê-lo seria melhor ser o mais legível para o seu desenvolvedor. Caso contrário, você realmente precisa de melhores desenvolvedores.
jalf

5
@despart: Se alguém não está familiarizado o suficiente com o C ++ para reconhecer esse idioma pelo que é, então eles precisam ficar longe da minha base de código.
Billy ONeal

4
Concordo que a maneira idiomática deve ser a mais legível. É por isso que as maneiras idiomáticas sempre precisam ser desafiadas e alteradas à medida que as línguas e práticas evoluem. Levou anos para que o terrível estilo de codificação "idiomática" da K&R fosse substituído pelo estilo moderno e mais legível, mas ainda assim aconteceu.
Jason Williams

11

Não apenas um padrão conhecido, mas um idioma padrão em C (e C ++)


3
Sim, e acho que alguns compiladores avisam while (true)pelo mesmo motivo if (true).
Steven Sudit 9/04/10

11
while(true)

gera um aviso com o Visual Studio (a condição é constante). Na maioria dos lugares em que trabalhei, a produção de compilação é criada com avisos como erros. assim

for(;;)

é preferível.


7
qual versão do visual studio você está usando? Com 2008 Não receber este aviso, mesmo com aviso de nível 4.
Jörgen Sigvardsson

11

Ambos devem ser iguais se o seu código for otimizado pelo compilador. Para explicar o que quero dizer com otimização, aqui está um código de exemplo escrito no MSVC 10:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

Se você construí-lo no modo Debug ( sem qualquer otimização (/ Od) ), a desmontagem mostra a clara diferença. Há instruções extras para a truecondição interna while.

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

No entanto, se você criar seu código no modo Release (com Maximize Speed ​​(/ O2) padrão ), obterá a mesma saída para ambos. Ambos os loops são reduzidos a uma instrução de salto.

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

O que você usar não importa para um compilador decente com a otimização de velocidade ativada.


Este é realmente um ponto muito bom! Sem otimização, mesmo os compiladores modernos serão diferentes por várias instruções.

9

É uma questão de preferência pessoal para que lado é mais rápido. Pessoalmente, sou um datilógrafo e nunca olho para o meu teclado durante a programação - posso digitar todas as 104 teclas do teclado.

Acho que se for mais rápido digitar "while (TRUE)".

Eu adicionei mentalmente algumas medidas de movimento dos dedos e as totalizei. "for (;;)" possui cerca de 12 larguras de teclas dos movimentos para trás e para a quarta (entre as teclas iniciais e as teclas e entre as teclas iniciais e a tecla SHIFT) "enquanto (TRUE)" possui cerca de 14 larguras de teclas dos movimentos para trás e quarto.

No entanto, sou muito menos propenso a erros ao digitar o último. Penso mentalmente em palavras de cada vez, por isso acho mais rápido digitar coisas como "nIndex" do que acrônimos como "nIdx" porque tenho que soletrar mentalmente as letras em vez de falar dentro da minha mente e deixar meus dedos automaticamente - digite a palavra (como andar de bicicleta)

(Meu benchmark TypingTest.com = 136 WPM)


3
Acredito que o OP estava se referindo à velocidade de tempo de execução, não à velocidade de digitação.

Eu sei. Só tinha que cobrir essa base também.
Re

7
s / preferência pessoal / hábito individual /
SamB 09/04/10

@SamB: Comentário com voto positivo para s ///. xD E sim, embora eu tenha sugerido que talvez seja devido à velocidade do tempo de execução, eu não sabia a resposta real. Se fosse isso, eu teria sido feliz.
Chris Cooper

Execute time head -10 >/dev/null, digite cada 10 vezes e meça os resultados. Aposto que você será mais rápido, a for(;;)menos que trapaceie. Eu estava em cerca de 14%.
PSKocik # 25/15

6

Todas as boas respostas - o comportamento deve ser exatamente o mesmo.

NO ENTANTO - apenas suponha que isso fez a diferença. Suponha que um deles tenha mais 3 instruções por iteração.

Você deveria se importar?

SOMENTE se o que você faz dentro do loop é quase nada , o que quase nunca acontece.

O que quero dizer é que há micro-otimização e macro-otimização. Micro-otimização é como "cortar o cabelo para perder peso".


3
Com que freqüência você vê as pessoas disseram preferir ++imais i++?
Dennis Zickefoose

7
@Dennis Zickefoose: A diferença entre ++ie i++pode ser significativa se ifor uma instância de uma classe e não um built-in e o compilador não aplicar a otimização trivial. O conselho é adquirir um hábito para que não o pegue quando for necessário.
Clifford

5
O problema do ++ivs i++é que não custa nada fazer a "otimização". É verdade que, na maioria dos casos, não faz absolutamente nenhuma diferença, mas são igualmente fáceis de digitar; por que não preferir o potencialmente mais eficiente por padrão? E suponho que o mesmo se aplica aqui. Se um foi um pouquinho mais rápido que o outro, por que não escolher o mais rápido? O que perderíamos fazendo isso? Ambos são bastante fáceis de ler e digitar.
jalf

2
@Dennis Zickefoose: Você está certo. Eu vejo muito isso no SO, e o comentário de Clifford está certo. Além disso, há algo que eu não vejo muito no SO e é como otimizar a macro, como uma aceleração de 43x: stackoverflow.com/questions/926266/… . Então, eu me pergunto sobre nossas prioridades.
precisa saber é o seguinte

2
@ Mike: Sim, mas isso é uma comparação de maçãs com laranjas. Cortar o cabelo leva tempo real e provavelmente até dinheiro. Eu concordo que é uma micro otimização que realmente não importa. Mas também não nos custa nada. se eu posso optar por ir para a esquerda ou direita, e a distância é a mesma, o terreno é o mesmo, tudo é o mesmo, exceto que o caminho esquerdo tem algum benefício microscópico marginal, por que não ir para a esquerda? Você está certo, não é um argumento impressionante. Mas quando o custo é literalmente zero, não vejo razão para preferir a rota menos ideal.
jalf

5

Não consigo imaginar que um compilador que valha a pena gere qualquer código diferente. Mesmo que isso acontecesse, não haveria maneira de determinar sem testar o compilador específico que era mais eficiente.

No entanto, sugiro que você prefira for(;;)pelos seguintes motivos:

  • vários compiladores que eu usei gerarão um aviso de expressão constante por enquanto (true) com as configurações apropriadas do nível de aviso.

  • no seu exemplo, a macro TRUE pode não ser definida como você espera

  • existem muitas variantes possíveis do infinito quando laço, tais como while(1), while(true), while(1==1)etc .; então for(;;)é provável que resulte em maior consistência.


TRUE pode não ser #define TRUE 1, mas qualquer base de código while(TRUE)avaliada como while(0)provavelmente não será beneficiada for(;;).
Justin

@ Justin: Eu concordo, seria realmente perverso, e não é o mais forte dos três argumentos, mas Bjarne Stoustrup usa um argumento semelhante para evitar a macro NULL em C ++. while(true)deve ser preferido em qualquer caso. Em C ++ boolé reservado e em C definido em C stdbool.h (tornando-o menos seguro em C). for(;;)remove toda dúvida.
Clifford

5
for(;;Sleep(50))
{
    // Lots of code
}

É mais claro que:

while(true)
{
    // Lots of code
    Sleep(50);
}

Não que isso se aplique se você não estiver usando Sleep().


1
É maldito código ruim, temporizador deve ser usado em vez de dorme, por isso é mau exemplo
ST3

12
@ ST3 - Sim, você está certo. Meu código é horrível. Eu deveria me esforçar mais na próxima vez que fizer um loop infinito.
Armada

1
@Frammo - depende do seu sistema operacional, mas geralmente algo comotimerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta 11/11/16

2
Não há nada limpo sobre a chamada de uma função como dentro sono de um loop for assim
Greg

1
OMG, timerService.scheduleRepeating (50, [] () {}) é muito mais fácil de digitar e entender do que dormir (50).
Cool Javelin

4

O loop "para sempre" é popular em sistemas incorporados como um loop em segundo plano. Algumas pessoas o implementam como:

for (; ;)
{
 // Stuff done in background loop
}

E às vezes é implementado como:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

E ainda outra implementação é:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

Um compilador de otimização deve gerar o mesmo código de montagem ou similar para esses fragmentos. Uma observação importante: o tempo de execução dos loops não é uma grande preocupação, pois esses loops duram para sempre e é gasto mais tempo na seção de processamento.


8
Se um compilador gera código diferente para esses, é hora de abandonar o compilador e obter um das últimas duas décadas.
GManNickG

5
"o tempo de execução para os loops não é uma grande preocupação uma vez que estes laços continuar para sempre" - isso soa tão errado para mim ..
Blindy

3
@Blindy - porque está errado, o que preocupa é a fração do tempo de execução gasto processando a lógica de loop ou a quantidade de lógica de loop por unidade de trabalho útil, nenhuma das quais é ajudada pelo infinito loop
Ben Voigt

3

Presumo que (true) seja mais legível do que para (;;) - parece que o programador perde algo no loop for :)


Eu me preocupo com velocidade. Especialmente se houver uma otimização que afetará meu código infinitas vezes.
Kowalski

2

O motivo mais importante para usar "for (;;)" é o medo de usar "while (TRUE)" ao executar a programação exploratória. É mais fácil controlar a quantidade de repetições com "for" e também mais fácil converter o loop "for" em um infinito.

Por exemplo, se você estiver construindo uma função recursiva, poderá limitar a quantidade de chamadas para a função antes de converter em um loop infinito.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

Quando tenho certeza da minha função, eu a converto em um loop infinito:

    for(;;) recursiveFunction(oneParam);

3
O primeiro loop possui um erro de sintaxe (sem ponto e vírgula).
Jens

3
Ha! Demonstrando assim a desvantagem de for (;;);)
Andrew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.