Як зробити так, щоб петлі в Java збільшувались з кроком, відмінним від 1


82

Якщо у вас такий цикл for:

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

Це чудово працює. Але коли у вас такий цикл for:

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

це не працює. Чи може хтось пояснити мені це?


17
+1 за те, що ви спробували щось самі, перш ніж запитати тут.
Фальмаррі

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

@dkarp ~ Справді, але, бачачи, як більшість людей не думають про цей синтаксис, думав, що я на це вкажу. Тим більше, що ОП, очевидно, вивчає Java та програмування у молодому віці (перевірте профі та зв’язаний блог). Мені б хотілося, щоб у мене у цьому віці було ТО.
jcolebrand

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.

(Тут можна сказати не багато іншого, якщо це пов’язано із синтаксисом, я б запропонував спочатку погуглити, але я тут новачок, тому можу помилитися.)


3
Ви маєте рацію, але оригінальне запитання має таке, j+3яке насправді не збільшується j. ОП слід використовувати j += 3.
Greg Hewgill

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, що означає оператор постфіксу (use-then-change), що еквівалентно 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.