Cómo hacer que los bucles for en Java aumenten en incrementos distintos de 1

82

Si tiene un bucle for como este:

for(j = 0; j<=90; j++){}

Funciona bien. Pero cuando tienes un bucle for como este:

for(j = 0; j<=90; j+3){}

no funciona. ¿Podría alguien explicarme esto?

TomLisankie
fuente
17
+1 por probar algo usted mismo antes de preguntar aquí.
Falmarri
1
¿El efecto secundario de j++es? ¿El efecto secundario de j+3es?

Respuestas:

119

Eso es porque j+3no cambia el valor de j. Debe reemplazar eso con j = j + 3o j += 3para que el valor de jaumente en 3:

for (j = 0; j <= 90; j += 3) { }

fuente
2
Alternativamente, podría, int j=0; for(;j<=90;){... j+=3;}pero eso no es obvio;)
jcolebrand
6
@drachenstern En otras palabras, un ciclo while.
dkarp
@dkarp ~ De hecho, pero dado que la mayoría de la gente no piensa en esa sintaxis, pensé en señalarlo. Especialmente porque el OP obviamente está aprendiendo Java y programación a una edad temprana (consulte el profee y el blog vinculado). Ojalá hubiera tenido TAN a esa edad.
jcolebrand
44

Dado que nadie más ha abordado realmente Could someone please explain this to me?, creo que lo haré:

j++ es una abreviatura, no es una operación real (ok, realmente lo ES, pero tengan paciencia conmigo para la explicación)

j++es realmente igual a la operación j = j + 1;excepto que no es una macro o algo que reemplaza en línea. Hay muchas discusiones aquí sobre las operaciones de i+++++iy lo que eso significa (porque podría interpretarse como i++ + ++iOR(i++)++ + i

Lo que nos lleva a: i++versus ++i. Se denominan operadores post-incrementy pre-increment. ¿Puedes adivinar por qué se llaman así? La parte importante es cómo se utilizan en las asignaciones. Por ejemplo, podría hacer: j=i++;o j=++i;Ahora haremos un experimento de ejemplo:

// declare them all with the same value, for clarity and debug flow purposes ;)
int i = 0;
int j = 0;
int k = 0;

// yes we could have already set the value to 5 before, but I chose not to.
i = 5;

j = i++;
k = ++i;

print(i, j, k); 
//pretend this command prints them out nicely 
//to the console screen or something, it's an example

¿Cuáles son los valores de i, j y k?

Te daré las respuestas y dejaré que lo resuelvas;)

i = 7, j = 5, k = 7;Ese es el poder de los operadores de incremento previo y posterior, y los peligros de usarlos incorrectamente. Pero aquí está la forma alternativa de escribir el mismo orden de operaciones:

// declare them all with the same value, for clarity and debug flow purposes ;)
int i = 0;
int j = 0;
int k = 0;

// yes we could have already set the value to 5 before, but I chose not to.
i = 5;

j = i;
i = i + 1; //post-increment

i = i + 1; //pre-increment
k = i;

print(i, j, k); 
//pretend this command prints them out nicely 
//to the console screen or something, it's an example

Bien, ahora que le he mostrado cómo funciona el ++operador, examinemos por qué no funciona para j+3... ¿Recuerda cómo lo llamé "taquigrafía" antes? Eso es todo, vea el segundo ejemplo, porque eso es efectivamente lo que hace el compilador antes de usar el comando (es más complicado que eso, pero eso no es para las primeras explicaciones). Entonces verá que la "taquigrafía expandida" tiene i =Y, i + 1que es todo lo que tiene su solicitud.

Esto vuelve a las matemáticas. Una función se define donde f(x) = mx + bo una ecuación, y = mx + bentonces, ¿cómo lo llamamos mx + b? Ciertamente no es una función o ecuación. A lo sumo es una expresión. Que es todo j+3es, una expresión. Una expresión sin asignación no nos sirve de nada, pero consume tiempo de CPU (asumiendo que el compilador no la optimiza).


Espero que eso le aclare las cosas y le dé algo de espacio para hacer nuevas preguntas. ¡Salud!

jcolebrand
fuente
9

En su ejemplo, se j+=3incrementa en 3.

(No hay mucho más que decir aquí, si está relacionado con la sintaxis, sugeriría buscar en Google primero, pero soy nuevo aquí, así que podría estar equivocado).

Connor
fuente
3
Tienes razón, pero la pregunta original tiene j+3que en realidad no aumenta j. El OP debería usar j += 3.
Greg Hewgill
8
for(j = 0; j<=90; j = j+3)
{

}

j+3no asignará el nuevo valor a j, add j=j+3asignará el nuevo valor a j y el ciclo se moverá hacia arriba en 3.

j++es como decir j = j+1, entonces en ese caso estás asignando el nuevo valor a j como el anterior.

Abraham Adam
fuente
6

Cambio

for(j = 0; j<=90; j+3)

a

for(j = 0; j<=90; j=j+3)
Aravind Yarram
fuente
4

Debería ser así

for(int j = 0; j<=90; j += 3) 

pero cuidado con

for(int j = 0; j<=90; j =+ 3) 

o

for(int j = 0; j<=90; j = j + 3)
Konz Mama
fuente
2

Simplemente prueba esto

for(int i=0; i<5; i=i+2){//value increased by 2
//body
}

O

for(int i=0; i<5; i+=2){//value increased by 2
//body
}
Abdul Basit Rishi
fuente
1

También puede escribir código como

for(int i=0;i<n;i++)
{
      //statements;
      i=i+2;//cause you want to increment i by 3 
}
Prajakta Kale
fuente
1
for(j = 0; j<=90; j++){}

j ++ significa j = j + 1, el valor de j ya es 0 ahora estamos agregando 1 así que ahora el valor de la suma de j + 1 se convirtió en 1, finalmente estamos anulando el valor de j (0) con el valor de la suma (1) así que aquí estamos anulando el valor j por j + 1. Entonces, cada valor de la iteración j se incrementará en 1.

for(j = 0; j<=90; j+3){}

Aquí j + 3 significa j valor ya 0 ahora estamos agregando 3 así que ahora el valor de la suma de j + 3 se convirtió en 3 pero no estamos anulando el valor j existente. Para que JVM le pregunte al programador, está calculando el nuevo valor pero asignando ese valor a una variable (es decir, j). Es por eso que recibimos el error en tiempo de compilación "AssignmentOperator no válido".

Si queremos incrementar el valor j en 3, entonces podemos usar cualquiera de las siguientes formas.

 for (int j=0; j<=90; j+=3)  --> here each iteration j value will be incremented by 3.
 for (int j=0; j<=90; j=j+3) --> here each iteration j value will be incremented by 3.  
Gopi Rajkumar
fuente
0

La parte de "incremento" de una declaración de ciclo tiene que cambiar el valor de la variable de índice para tener algún efecto. La forma a mano de "++ j" es "j = j + 1". Entonces, como han dicho otras respuestas, la forma correcta de su incremento es "j = j + 3", que no tiene una abreviatura tan concisa como incrementar en uno. "j + 3", como ya sabe, en realidad no cambia j; es una expresión cuya evaluación no tiene ningún efecto.

warrenm
fuente
0

Si tiene un bucle for como este:

for(j = 0; j<=90; j++){}

En este ciclo, está utilizando la abreviatura proporcionada por el lenguaje java, que significa un operador de sufijo (use-then-change) que es equivalente a j = j + 1, por lo que el valor cambiado se inicializa y se usa para la siguiente operación.

for(j = 0; j<=90; j+3){}

En este ciclo, solo incrementa su valor en 3 pero no lo inicializa de nuevo a la variable j, por lo que el valor de j permanece cambiado.

shraddha bhardwaj
fuente
0

Es solo un error de sintaxis. Solo tienes que reemplazar j+3por j=j+3o j+=3.

ashwini chaudhari
fuente
0
for (let i = 0; i <= value; i+=n) { // increments by n
/*code statement*/
}

este formato funciona para mí aumentando el índice en n

for (let i = 0; i <= value; i+=4) { // increments by 4
/*code statement*/
}

si n = 4 esto se incrementará en 4

Cj Oyales
fuente