Por que estou vendo tantas construções (;;)? [fechadas]


14

Na minha opinião, um loop for é usado para iterar em um intervalo conhecido ou determinável.

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

que é equivalente (escopo de i de lado) a:

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

Em outras palavras, o forloop é simplesmente um açúcar sintático (altamente útil) para uma whileconstrução comumente usada .

No entanto, estou vendo muitas for(;;)construções na Web que são funcionalmente equivalentes awhile(true)

Qual o motivo disso? Por que o loop for infinito seria preferido sobre o loop while infinito?

// Eu até vi um livro sobre Java que não usava loops! Levando a construções monstruosas como:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

O principal motivo é a preferência. A legibilidade deve entrar em jogo ao fazer a escolha, no entanto YMMV.
precisa

Por que alguém preferiria a construção estranha?
precisa

10
Você poderia trocar whilee foraqui e a pergunta não mudaria. while(true)e for(;;)significa a mesma coisa. Você obviamente tem uma forte preferência por while, outros podem ter uma preferência igualmente forte por for. É impossível dizer que um é mais correto que o outro.
Caleb

3
@ Chris, eu não acho nada for(;;)confuso. É um idioma C padrão, que você documentará na seção 3.5 de K&R (2e). Eu entendo que você não gosta; você deve entender que outras pessoas obviamente preferem (senão você nunca a veria). Pode ser mais ou menos aceitável em idiomas diferentes de C; você marcou esse idioma como agnóstico, o que diminui apenas a possibilidade de uma resposta definitiva. Novamente, votei para fechar porque o Q não é construtivo; se eu estivesse ofendido, eu teria sinalizado como ofensivo em vez de ou além do fechamento. Isso é tudo.
Caleb

1
Pessoalmente, acho que há uma oportunidade real aqui de ter outra sintaxe inteiramente para loops infinitos: algo comowheeeeeeee { ... }
detly

Respostas:


33

É um impedimento de práticas de programação antigas no PDP-11 (sim, eu disse anteriormente ). Ele costumava salvar uma única instrução, que era útil para tornar os loops mais rápidos.

Consulte o seguinte para obter informações adicionais: http://www.flounder.com/exceptions.htm


3
Era exatamente isso que eu estava procurando. Há uma razão real e legítima, mas não é mais válida.
22811 Chris Cudmore

1
@chris Nnnope, os compiladores modernos às vezes reclamam sobre o uso de uma constante na condição de um loop. Não é puramente uma ressaca.
Izkata

Há mais do que isso. Lembro-me de escrever C no início dos anos 90 em sistemas unix e enquanto (verdadeiro) {} não era uma opção. Não havia um tipo booleano padrão, mas vários sistemas unix definiam seus próprios arquivos de cabeçalho C. A partir da memória, pelo menos um fornecedor unix definiu TRUE como zero, supostamente para auxiliar no processamento de retornos de funções, pois a convenção era retornar zero com êxito e números positivos eram falhas. Isso significava que enquanto (TRUE) {} não era portátil.
Michael Shaw

1
Não consigo encontrá-lo agora, mas posso jurar que, há alguns anos, Dennis Ritchie escreveu um post na Usenet afirmando que isso estava errado, e ele usa a for(;;)sintaxe como (na opinião deles) uma declaração mais direta de intenção de que não havia nenhum critério sendo declarado para sair do loop.
Jerry Coffin

@Ptolomeu: Bem, você certamente poderia ter escrito while(1) { }.
Ed S.

10

alguns compiladores emitem um aviso (algo como expressão condicional é constante ) ao usar, while( 1 )mas com for( ; ; )nada para avisar. Os programadores desejam código sem avisos e, portanto, usam a variante for.


Algumas coisas que os compiladores alertam são perfeitamente válidas e até (em alguns casos especiais) inevitáveis. Portanto, alguns de nós tratam os avisos como também avisos. Se você ignorá-los, é claro que você pode mergulhar nas coisas malditas e não ver as importantes - mas há pragmas e opções para desativar os avisos, local ou globalmente. Basicamente, sim, é melhor não ter avisos, mas geralmente preciso de um motivo mais forte do que isso para adotar um estilo de código pior. Aqui não é pior, apenas diferente, mas loops "infinitos" são raros (ou muito ruins) de qualquer maneira.
Steve314

5

É um hábito adquirido na programação C, onde não há um tipo booleano. Enquanto (1) seria o equivalente potencialmente, mas For (;;) é ​​frequentemente usado como aparece em K&R, se bem me lembro. Eu suspeito que havia uma razão de hardware lá em algum lugar também.


4
... suspeito que foi uma razão hardware ...
Aaron McIver

2
Como Edward Robertson mencionou, o motivo é que o compilador C no PDP-11 não percebeu que o verdadeiro em "enquanto (verdadeiro)" era uma constante de tempo de compilação e adicionaria uma instrução extra (uma comparação) ao gerar montagem. Por causa dos recursos limitados disponíveis no PDP-11, os programadores usaram o loop for para otimizar essa instrução extra do programa.
Jetti

3

pois (;;) pode ser lido como "para sempre", que alguns acham mais natural do que "enquanto verdadeiro".


Embora esse não seja o motivo original, é um motivo secundário pelo qual a preferência permaneceu muito tempo depois que o motivo original se tornou obsoleto. É muito difícil encontrar evidências para apoiar isso, além de pedir a programadores experientes.
darenw

-2

Todos os programadores experientes que pedi podem reconhecer for(;;)mais rapidamente do que while(true)ou while(1).


2
Qualquer programador que vale a pena saber reconhecer os três instantaneamente. Todos os três são comuns o suficiente para que qualquer pessoa que tenha passado mais de 5 minutos lendo o código tenha visto cada um deles várias vezes.
Chao

1
Estudos têm demonstrado que os programadores experientes podem compreender for(;;)14ms mais rápido do que while(1):-)
kevin Cline
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.