For infinito sem incremento

Bom, estava lendo um certo codigo outro dia e me deparei com a seguinte instrução:

for (;;){ 
codigos e mais codigos...}

Havia um comentario do desenvolvedor dizendo que seria um loop infinito. Mas, fiquei intrigado porque na documentação do for não é obrigado a ter a instrução de incremento?
De qual outra maneira “estranha” o for pode ser usado?
Obs: Conheço o for aprimorado…

Tinha um for justamente desse jeito que você escreveu? Sem nenhum parâmetro?

Aguardo a opinião dos mais experientes, mas até onde eu conheço o for é um loop que tem seu “tempo de vida” muito bem definido. O papel de um loop infinito quem faz melhor seria o while.

Estou certo?

[quote=Johnnny8]Bom, estava lendo um certo codigo outro dia e me deparei com a seguinte instrução:

for (;;){ 
codigos e mais codigos...}

Havia um comentario do desenvolvedor dizendo que seria um loop infinito. Mas, fiquei intrigado porque na documentação do for não é obrigado a ter a instrução de incremento?
De qual outra maneira "estranha" o for pode ser usado?
Obs: Conheço o for aprimorado…
[/quote]

Tendo em vista que a estrutura do for básico é:

for (inicializacao; condicao; incremento)

Até onde sei nenhuma das lacunas obriga ter declarações, posso ter além desse exemplo que você mostrou ter esses outros:

// for (var i = 0; ; ); editando... var em Java é trash, rsrsrs
for (int i = 0; ; ); // agora está correto

for ( ; i <= 10; );

for ( ; ; i++);

A questão é que declarar de qualquer uma dessas formas torna o código mais difícil de entender e mais fácil de gerar problemas.

[quote=Ruttmann]Tinha um for justamente desse jeito que você escreveu? Sem nenhum parâmetro?

Aguardo a opinião dos mais experientes, mas até onde eu conheço o for é um loop que tem seu "tempo de vida" muito bem definido. O papel de um loop infinito quem faz melhor seria o while.

Estou certo?[/quote]

Não necessariamente, no caso:

for ( ; ; )...

Assume um true implicito, seria a mesma coisa que isso:

for ( ; true; )...

E nesse caso como a condição nunca alcança false, torna-se infinito, o que vale também para um while.

Quanto ao papel de cada um, o while é para situações onde não sabemos quantas vezes precisamos iterar (exe: autenticar um usuário).
Já o for é utilizado para situações onde sabemos quantas vezes precisamos iterar (ex: contar os pares de 0 a 100)

Segue alguns exemplos:


Scanner scan = new Scanner(System.in);
boolean autenticou = false;

while (!autenticou) {
   System.out.print("Usuário: ");
   //String usuario = scan.next();
   String usuario = scan.nextLine(); // mais confiável
   System.out.print("Senha: ");
   // String senha = scan.next();
   String senha = scan.nextLine(); // aqui também
   
   if (usuario.equals("root") && senha.equals("123"))
      autenticou = true;
}

for (int i = 0; i <= 100; i++) {
   if (i % 2 == 0)
      System.out.println(i);
}

[quote=solidsnake][quote=Ruttmann]Tinha um for justamente desse jeito que você escreveu? Sem nenhum parâmetro?

Aguardo a opinião dos mais experientes, mas até onde eu conheço o for é um loop que tem seu “tempo de vida” muito bem definido. O papel de um loop infinito quem faz melhor seria o while.

Estou certo?[/quote]

Não necessariamente, no caso:

for ( ; ; )...

Assume um true implicito, seria a mesma coisa que isso:

for ( ; true; )...

E nesse caso como a condição nunca alcança false, torna-se infinito, o que vale também para um while.[/quote]

Ah, verdade!

Mas totalmente unusual…

:stuck_out_tongue:

[quote=Ruttmann]

Ah, verdade!

Mas totalmente unusual…

:P[/quote]

Totalmente, eu mesmo procuro usar sempre da forma mais intuitiva possível, esses lances são bons principalmente pra certificação, mas não curto nem um pouco.

É tem mesmo varias formas de fazer um for infinito, mas eu particularmente prefiro um while, se for para ser infinito.

tipo:

while(true){ … }

alias se seu objetivo é fazer um loop infinito eu recomendo você fazer assim

while(true){...}

usar o laço While junto com a instrução true deixa charo o seu objetivo que é criar um loop infinito, isso ajuda na interpretação melhor do código

Não podemos esquecer que uma hora ele terá de parar a iteração, seja com for, while, do while e afins, pois se isso não acontecer, pode ter certeza que o processador vai pro saco sem muito esforço.

Aliás, o autor do tópico está muito quieto, não se manifestou até agora?

É mesmo, tem que por um Sleep pra dar um tempo para a CPU, se não no minimo o programa trava, ou pode ser um loop infinito onde tem funções dentro desse loop que esperam dados do teclado ou que ficam “escutando alguma porta” e outras varias possibilidades.

E na dúvida, break neles! kkkkkk

[quote=solidsnake]

// for (var i = 0; ; ); editando... var em Java é trash, rsrsrs
for (int i = 0; ; ); // agora está correto

for ( ; i <= 10; );

for ( ; ; i++);
[/code][/quote]

Desculpe pela demora em responder... Então, quando eu declaro algum código como o citado acima, um for é complemento do outro para formar apenas 1 ou são totalmente independentes.
Ex: o for de 1,2 e 3 formam o 4 ou são independentes?
[code]//1
for (int i = 0; ; );

//2
for ( ; i <= 10; );

//3
for ( ; ; i++);

//4
for(int i = 0; i <= 10; i++){...}

[quote]
Assume um true implicito, seria a mesma coisa que isso: [/quote]

for(;true;);
Seguindo o raciocinio…
Se o for assume um true implicitamente, quer dizer que se eu fizer um while(;); vai ser um laço de repetição infinito?

O que seria alem do minimo?

Me surgiu uma duvida meio “boba” aqui agora… Se não usar um sleep vamos sobrecarregar o processador…mas e a JVM… Pode se sobrecarregar ou acontecer alguma coisa do tipo? É possivel um programa “fuder” com a JVM?

Só pra constar… Estava lendo um artigo de vírus em java. Lá havia esse código aonde o autor preenchia um documento de txt infinitamente com a tentativa de sobrecarregar o HD e o processador…

Não confunda as coisas… eles integram ou são separados com base no corpo de cada um.

Perceba que para cada for que declarei existe um ponto-vírgula no final. Essa forma quer dizer que todos os 4 são independentes.

Agora como cada um deles não tem {} não quer dizer que não tem um corpo entende? O corpo de cada um deles é o ;

Ou seja, é um corpo sem instrução, apenas para tentar explicar a sua dúvida anterior quanto ao cabeçalho do for.

Se eu quisesse aninhá-los (declarar um dentro do outro) teria de ser dessa forma:

for (int i = 0; i <= 10; i++)
   for (int j = 0; j <= 5; j++)
      for (int k = 0; k <= 2; k++)
         System.out.println("i = " + i + ", j = " + j + ", k = " + k);

Para reforçar, seria a mesma coisa que isso:

for (int i = 0; i <= 10; i++) {
   for (int j = 0; j <= 5; j++) {
      for (int k = 0; k <= 2; k++) {
         System.out.println("i = " + i + ", j = " + j + ", k = " + k); // opa aqui já tem
      }
   }
}

E para reforçar mais ainda o primeiro caso do ponto-virgula:

for (int i = 0; i <= 10; i++)
   ;

for (int j = 0; j <= 5; j++)
   ;
    
for (int k = 0; k <= 2; k++)
   ;

Que seria a mesma coisa que isso:

for (int i = 0; i <= 10; i++) {

}

for (int j = 0; j <= 5; j++) {

}
    
for (int k = 0; k <= 2; k++) {

}

Há várias formas de se declarar laços, isso também vale para if, if-else, switch/case etc.

Seguindo o raciocínio de que cada ponto e vírgula é um fim de instrução, o for aceita três tipos de instrução lembra lá no meu primeiro post:

for (inicializacao; condicao; incremento);

Ou seja, dentro de um laço posso ter no máximo três instruções correto? Por isso tenho de separá-las com ;

O while possui apenas um tipo de instrução:

while (condicao);

Logo não preciso/posso declarar o ;

Outra coisa é que no caso do while ele obriga você declarar a instrução, então:

while ()

Não é válido, ele precisa saber se é true ou false.

Cara desculpe o post tão grande, mas é que você ficou muito tempo sem responder e agora está querendo tirar suas dúvidas de uma vez só, isso confunde até a gente, rsrsrs, mas espero ter sido mas claro agora.

[quote]
Ou seja, dentro de um laço posso ter no máximo três instruções correto?[/quote]

Correto.

Só mais uma pergunta…
Quando eu faço:

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

O for contará de 0 a 1000 mesmo não tendo nada para ele executar?

Li em algum livro…
Não me lembro ao certo mas… parece que o java pula a instrução e no C executa até 1000… O C é mais rapido mas o java é mais inteligente… é isso mesmo?

Muito obrigado pela boa vontade em responder solidsnake, victor, patterson e ruttman. Que bom que existem pessoas de boa vontade aqui no Guj como vocês…

[quote=Johnnny8][quote]
Ou seja, dentro de um laço posso ter no máximo três instruções correto?[/quote]

Correto.

Só mais uma pergunta…
Quando eu faço:

for(int i = 0; i &lt;= 1000; i++);

O for contará de 0 a 1000 mesmo não tendo nada para ele executar?

Li em algum livro…
Não me lembro ao certo mas… parece que o java pula a instrução e no C executa até 1000… O C é mais rapido mas o java é mais inteligente… é isso mesmo?

Muito obrigado pela boa vontade em responder solidsnake, victor, patterson e ruttman. Que bom que existem pessoas de boa vontade aqui no Guj como vocês…[/quote]

Isso mesmo, devido o compilador sempre checar o código antes de compilá-lo, ele busca deixar seu código mais performático, assim ele acaba corrigindo algumas coisas que ele acha inviável como por exemplo o "laço sem corpo" no exemplo acima.

Ele deve pensar assim: Pô, qual sentido o programador declarou um for pra rodar mil vezes se ele não tem corpo, eu vou é "muquiar" essa treta aqui… kkkkk

[quote=Johnnny8][quote]
Ou seja, dentro de um laço posso ter no máximo três instruções correto?[/quote]

Correto.

Só mais uma pergunta…
Quando eu faço:

for(int i = 0; i &lt;= 1000; i++);

O for contará de 0 a 1000 mesmo não tendo nada para ele executar?

Li em algum livro…
Não me lembro ao certo mas… parece que o java pula a instrução e no C executa até 1000… O C é mais rapido mas o java é mais inteligente… é isso mesmo?

Muito obrigado pela boa vontade em responder solidsnake, victor, patterson e ruttman. Que bom que existem pessoas de boa vontade aqui no Guj como vocês…[/quote]olha até onde sei uma instrução é sempre uma instrução mesmo que ela seja redundante ou inútil como seria esse caso, e o mesmo ocorre em c;

quero dizer que se o programador quiser colocar ele coloca.

Por exemplo muitas vesses eu tenho o costume (mais em php) mas também faço em java de pegar uma variável booleana e verificar se ela é true assim :

boolean hue = true; if(hue == true){ }

eu faço isso para deixar explicito no código minha intenção (de certa forma chega a ser uma documentação) mas eu faço isso mais em php mas sabe como é o costumo de cachimbo deixa a boca torta.

Mesmo assim esse tipo de instrução o java vai ter mais trabalho talvez 1 nano segundo a mais, mas ele vai trabalhar a mais

O interessante para descobrir se o java é realmente “inteligente” como você citou, seria declarar uma variável anteriormente e usá-lá só após o for. Vamos ver se funciona :]

class app{
	public static void main(String[] args){
		int i;
		for(i=0; i<1000; i++);
		System.out.println(i);
		if(i==1000){
			System.out.println("Que decepcao, merece umas palmadas.");
		}else{
			System.out.println("Java é inteligente!");
		}
	}
}

Retornaria: http://snag.gy/DNpnr.jpg
Acho que java mereçe umas palmadas kk’

não disse, uma instrução é sempre uma instrução, mesmo sendo inútil

Não é inútil caso use uma variável já existente, mas se o java identificasse que foi criado uma nova variável, que terminasse naquele corpo do for(como sempre), e não tivesse realmente função nenhuma, não teria para que realizar a ação, mas é bom saber que os desenvolvedores não foram tolos o bastante para perder tempo com uma característica tão banal como essa, LOL