Как увеличить цикл for в Java с шагом, отличным от 1


82

Если у вас есть такой цикл for:

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

Работает нормально. Но когда у вас есть такой цикл for:

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

это не работает. Может кто-нибудь объяснить мне это?


17
+1 за то, что сначала попробовал что-то самому, прежде чем спрашивать здесь.
Falmarri 03

1
Побочный эффект j++? Побочный эффект j+3?

Ответы:


119

Это потому, j+3что не меняет значение j. Вам нужно заменить это на j = j + 3или j += 3так, чтобы значение jувеличилось на 3:

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

2
В качестве альтернативы он мог бы, int j=0; for(;j<=90;){... j+=3;}но это неочевидно;)
jcolebrand

6
@drachenstern Другими словами, цикл while.
dkarp 03

@dkarp ~ Конечно, но, видя, что большинство людей не думают об этом синтаксисе, я подумал, что я укажу на него. Тем более, что OP, очевидно, изучает Java и программирование в молодом возрасте (проверьте профи и связанный блог). Мне жаль, что у меня не было ТАКОГО возраста.
jcolebrand 03

44

Поскольку никто больше не занимался, Could someone please explain this to me?я думаю, что буду:

j++ сокращенно, это не настоящая операция (да, это действительно ЕСТЬ, но терпите меня за объяснение)

j++действительно эквивалентно операции, j = j + 1;за исключением того, что это не макрос или что-то, что выполняет встроенную замену. Здесь много дискуссий об операциях i+++++iи о том, что это означает (потому что это может быть истолковано как i++ + ++iИЛИ(i++)++ + i

Что подводит нас к: i++против ++i. Их называют post-incrementи pre-incrementоператоры. Вы можете догадаться, почему они так названы? Важная часть - как они используются в заданиях. Например, вы можете сделать: j=i++;или j=++i;Теперь мы проведем примерный эксперимент:

// 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

Каковы значения i, j и k?

Я дам вам ответы и дам вам разобраться;)

i = 7, j = 5, k = 7;В этом сила операторов до и после инкремента и опасность их неправильного использования. Но вот альтернативный способ записать тот же порядок операций:

// 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

Хорошо, теперь, когда я показал вам, как ++работает оператор, давайте посмотрим, почему он не работает для j+3... Помните, как я ранее называл это «сокращением»? Вот именно, см. Второй пример, потому что это фактически то, что делает компилятор перед использованием команды (это более сложно, чем это, но это не для первых объяснений). Итак, вы увидите, что в «расширенном сокращении» есть i =И, и i + 1это все, что есть в вашем запросе.

Это восходит к математике. Функция определяется где f(x) = mx + bили уравнением, y = mx + bтак что мы называем mx + b... это определенно не функция или уравнение. В лучшем случае это выражение. Что все j+3есть, выражение. Выражение без присваивания бесполезно, но требует процессорного времени (при условии, что компилятор не оптимизирует его).


Я надеюсь, что это проясняет вам ситуацию и дает вам возможность задать новые вопросы. Ура!


9

В вашем примере j+=3увеличивается на 3.

(Здесь особо нечего сказать, если это связано с синтаксисом, я бы предложил сначала поискать в Google, но я здесь новичок, поэтому могу ошибаться.)


3
Вы правы, но в исходном вопросе есть то, j+3что на самом деле не увеличивается j. OP следует использовать j += 3.
Грег Хьюгилл 03

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

}

j+3не будет присвоить новое значение j, add j=j+3присвоит новое значение j, и цикл переместится на 3 вверх.

j++это как сказать j = j+1, так что в этом случае вы присваиваете новое значение j, как указано выше.



4

Должно быть так

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

но берегись

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

или же

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



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

j ++ означает j = j + 1, значение j уже равно 0, теперь мы добавляем 1, поэтому теперь суммарное значение j + 1 стало 1, наконец, мы переопределяем значение j (0) на значение суммы (1), так что вот мы заменяя значение j на j + 1. Таким образом, значение каждой итерации j будет увеличиваться на 1.

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

Здесь j + 3 означает, что значение j уже равно 0, теперь мы добавляем 3, поэтому теперь суммарное значение j + 3 стало 3, но мы не отменяем существующее значение j. Итак, JVM спрашивает программиста, вы вычисляете новое значение, но при этом присваиваете это значение переменной (например, j). Вот почему мы получаем ошибку времени компиляции «invalid AssignmentOperator».

Если мы хотим увеличить значение j на 3, мы можем использовать любой из следующих способов.

 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.  

0

Часть «приращения» оператора цикла должна изменить значение индексной переменной, чтобы иметь какой-либо эффект. Полная форма "++ j" - "j = j + 1". Итак, как говорили другие ответы, правильная форма вашего приращения - «j = j + 3», что не имеет такого краткого сокращения, как приращение на единицу. «j + 3», как вы уже знаете, на самом деле не меняет j; это выражение, оценка которого не имеет никакого эффекта.


0

Если у вас есть такой цикл for:

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

В этом цикле вы используете сокращение, предоставляемое языком java, что означает постфиксный оператор (использование-затем-изменение), который эквивалентен j = j + 1, поэтому измененное значение инициализируется и используется для следующей операции.

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

В этом цикле вы просто увеличиваете свое значение на 3, но не инициализируете его обратно переменной j, поэтому значение j остается измененным.



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

этот формат работает для меня, увеличивая индекс на n

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

если n = 4, это будет увеличиваться на 4

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.