Mais de uma variável no campo de inicialização do for

Olá pessoal.

Tava escrevendo um código aqui e ao tentar criar duas variáveis no campo de inicialização da instrução for um erro de compilação ocorreu.
Por exemplo:

for (int var1 = 1, int var2 = 2; var1 < var2; var1++, var2--)
    ;

Então minha pergunta é: Não dá mesmo pra fazer isso ou existe alguma outra sintaxe?

da sim, o problema ficou na sua decaração o correto é:

for (int var1 = 1, var2 = 2; var1 < var2; var1++, var2--) {

}

Hmm… Mas isso limita bastante. Se eu quiser criar, por exemplo, var2 como double?

e porque não pode usar 2 for?
ou porque não pode usa-los encadeados?
ou porque não utiliza outro tipo de condiçao como switchcase ou whyle?

o que você quer fazer ? você pode declarar outros tipos fora do corpo e pode usar na expressão condicional ex:

        double num = 100.0d;
        boolean isPrime = true;
        for (int i = 1; i < num; i ++) {

        }

se tem uma coisa que o java não faz é te limitar :wink:

Limitado por limitado, declarar as variáveis dentro do laço (exceto o indice padrão) te limitará do mesmo jeito, independentemente do tipo (int, double, float, etc) concorda?

Se você está pensando em declarar mais de uma variável dentro do for, está pensando em criar um código confuso, sujeito a erros e, portanto, pensando em fazer kgada.

Em programação, nem sempre o que você pode fazer é o que você deve fazer.

Cara se for o caso: as vezes é usado um for dentro de outro. Mas sinceramente é a primeira vez que vi alguém tentando fazer isso.
Sem contar que se algum dia alguém pegar essa código para altera-lo vishhhhh complicou.
Quanto mais limpo e sucinto o código melhor.

É bem diferente criar 2 variáveis num for e criar um for dentro de outro. Geralmente, 2 variáveis funciona como se vc tivesse declarado uma variável fora do for, e em seguida, a adicionasse dentro.

Ou seja, mais como isso aqui:

int var2 = 2; for (int var1 = 1; var1 &lt; var2; var1++) { System.out.println(i + &quot; &quot; + j); var2--; }

Costumo declarar 2 variáveis no for, quando a condição de parada do for é lenta para ser calculada. Por exemplo:

NodeList nodeList = ...;
for (int i = 0, n = nodeList.getLength(); i < n; i++) {
     Node node = nodeList.item (i);
     ...
}

Neste caso não sei se getLength() no caso da classe que implementa org.w3c.dom.NodeList é lenta ou rápida. Para evitar chamar getLength a cada iteração do loop, eu uso a construção acima para chamar getLength() apenas uma vez.

É de proposito.

O que vc quer fazer não é uma iteração. Não é um for. É uma repetição (um while)


int var1 = 10;
int var2 = 100;

while (var1 < var2 ){
      var1++;
      var2--;
}

Para que isto serve ? Não importa, mas o que vc está fazendo é saber onde var1 e var 2 convergem. Na realidade vc está calculando var2-var1 da forma mais dificil.
E é por isso que a sintaxe não aguenta. Vc não está usando os conceitos corretos.

Isso é bem interessante. De qualquer forma, seu controle está sempre sobre uma variável só, não em cima de duas… quando aparece mais de um contador é que as coisas ficam tenebrosas.

[quote=entanglement]Costumo declarar 2 variáveis no for, quando a condição de parada do for é lenta para ser calculada. Por exemplo:

NodeList nodeList = ...;
for (int i = 0, n = nodeList.getLength(); i < n; i++) {
     Node node = nodeList.item (i);
     ...
}

Neste caso não sei se getLength() no caso da classe que implementa org.w3c.dom.NodeList é lenta ou rápida. Para evitar chamar getLength a cada iteração do loop, eu uso a construção acima para chamar getLength() apenas uma vez.[/quote]

Para evitar chamar o método a cada iteração … você não chama! ora… :slight_smile:

NodeList nodeList = ...;
final int size = nodeList.getLength();

for (int i = 0; i < size; i++) {
     Node node = nodeList.item (i);
     ...
}

Pronto. É a mesma coisas. Mas é mais fácil de ler. Sem subterfúgios linguísticos sinistros e usando final vc deixa claro que é uma variável auxiliar ( e que não mudará duante o for, o que é importante)

A diferença é que no caso do Entanglement, a variável size não sai do escopo do for. A sua está fora do escopo, e sobrevive ao for.

Não é um grande problema se vc fatora corretamente o código e se seus métodos são suficientemente curtos.