Как сделать для цикла в Java увеличение с шагом, отличным от 1 - PullRequest
66 голосов
/ 03 января 2011

Если у вас есть цикл for, подобный этому:

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

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

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

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

Ответы [ 10 ]

101 голосов
/ 03 января 2011

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

for (j = 0; j <= 90; j += 3) { }
39 голосов
/ 03 января 2011

Так как никто другой на самом деле не занялся 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 = AND i + 1, и это все, что есть в вашем запросе.

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


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

9 голосов
/ 03 января 2011

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

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

7 голосов
/ 03 января 2011
for(j = 0; j<=90; j = j+3)
{

}

j+3 не назначит новое значение для j, добавление j=j+3 назначит новое значение для j, и цикл увеличится на 3.

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

6 голосов
/ 03 января 2011

Изменить

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

на

for(j = 0; j<=90; j=j+3)
4 голосов
/ 22 декабря 2015

Так и должно быть

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)
0 голосов
/ 23 января 2019

Просто попробуйте это

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

ИЛИ

for(int i=0; i<5; i+=2){//value increased by 2
//body
}
0 голосов
/ 18 октября 2018
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). Вот почему мы получаем ошибку времени компиляции "недопустимый 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 голосов
/ 22 декабря 2015

Если у вас есть цикл for, подобный этому:

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

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

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

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

0 голосов
/ 03 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...