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.
[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]
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.
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.
// 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?
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 <= 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 <= 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!");
}
}
}
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