Como funciona um loop for, especificamente para (;;)?

Olhando através de alguma empresa antiga, me deparei com um loop for que se parece com isso:

for (;;) { //Some stuff } 

Eu tentei o Google, mas não consegui encontrar nenhuma resposta. Eu dormi em uma aula de programação ou é um loop incomum?

Um loop for em java tem a seguinte estrutura –

 for (initialization statement; condition check; update) loop body; 

Como você pode ver, existem quatro declarações aqui –

  1. Instrução de boot: Esta instrução é executada apenas uma vez, quando o loop é inserido pela primeira vez. Esta é uma declaração opcional, o que significa que você pode escolher manter este campo em branco. Geralmente é usado para algum propósito de boot.
  2. Verificação condicional: esta afirmação é provavelmente a mais importante. Ele verifica para verificar se determinada expressão é verdadeira ou não. Se for, a execução do loop continua. Você pode optar por manter este campo vazio, que será avaliado como true .
  3. Atualização: Esta lista de instruções é executada da esquerda para a direita, normalmente usada para incrementar / decrementar alguma variável.
  4. loop body: O corpo do loop, que será executado novamente com base no valor de verdade da verificação condicional.

Basicamente, é assim que a execução segue – primeiro, quando o loop é inserido pela primeira vez, a instrução de boot é executada uma vez. Em seguida, a verificação condicional é executada para ver se ela foi avaliada como verdadeira. Se for, o corpo do loop será executado, caso contrário, a execução do loop será concluída. Depois disso, a (s) declaração (ões) de atualização é (são) executada (s). Em seguida, a verificação condicional é executada novamente e, se for avaliada como verdadeira, o corpo do loop é executado novamente, a instrução de atualização é executada e, novamente, a verificação condicional … você obtém a imagem.

Agora sobre a sua syntax for( ; ; ) ;; for( ; ; ) . Não possui instrução de boot, portanto, nada será executado. Sua instrução de verificação condicional também está vazia, o que significa que ela é avaliada como verdadeira. Depois disso, o corpo do loop é executado. Em seguida, como a instrução de atualização está vazia, nada é executado. Em seguida, a verificação condicional é executada novamente, que será novamente avaliada como verdadeira e, em seguida, todo esse processo será repetido novamente.

Então, você vê, isso é basicamente um loop infinito que não tem instrução de boot, cuja verificação condicional sempre será avaliada como verdadeira e que não possui uma instrução de atualização. Isso é equivalente a –

 while(true) { ..... } 

que é outra construção de loop popular em java.

Quando você usa um loop infinito como esse, é importante prestar atenção à condição de quebra, já que na maioria dos casos você não pode deixar um loop rodar indefinidamente. Para sair desses tipos de loops, você pode usar a instrução break . A estrutura é a seguinte –

 if(some_condition_is_true) break; // This will cause execution to break out of its nearest loop 

ou

 if(some_condition_is_false) break; 

Isso é o mesmo que:

 while(true) { //Some Stuff } 

Basicamente, uma syntax alternativa para um loop infinito.

Esses são todos loops infinitos

 for(;;) { // endlessly } while(true) { // endlessly } do { // endlessly } while(true); 

Esse loop não tem guarda e atua como um loop while (true). Irá repetir infinitamente até uma pausa.

É um loop infinito. Não é exatamente uma boa codificação porque não é intuitivo compilar ou não um erro de execução. Reescrevendo como while(true) { /* code */ } seria muito mais legível para indicar um loop infinito.

É um loop infinito. As instruções de boot, condição e incremento são todas opcionais, portanto, sem nenhuma delas, isso sempre fará um loop novamente (a menos que uma quebra seja atingida ou alguma outra construção interaja com ela).

Embora eu não tenha certeza sobre Java, esta questão explica como no .net seu vazio for um while (true) será compilado para exatamente a mesma coisa. Eu não ficaria surpreso se Java também o fizesse.