Jak sprawić, by pętle w Javie rosły o przyrosty inne niż 1


82

Jeśli masz pętlę for, taką jak ta:

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

To działa dobrze. Ale kiedy masz pętlę for, taką jak ta:

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

to nie działa. Czy ktoś mógłby mi to wyjaśnić?


17
+1 za wypróbowanie czegoś samodzielnie, zanim zapytasz tutaj.
Falmarri,

1
Efektem ubocznym j++jest? Efektem ubocznym j+3jest?

Odpowiedzi:


119

To dlatego, j+3że nie zmienia wartości j. Musisz to zamienić na j = j + 3lub j += 3tak, aby wartość jwzrosła o 3:

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

2
Alternatywnie mógł, int j=0; for(;j<=90;){... j+=3;}ale to nieoczywiste;)
jcolebrand

6
@drachenstern Innymi słowy, pętla while.
dkarp,

@dkarp ~ Rzeczywiście, ale widząc, że większość ludzi nie myśli o tej składni, pomyślałem, że wskażę na to. Zwłaszcza, że ​​OP oczywiście uczy się języka Java i programowania w młodym wieku (sprawdź profesora i powiązany blog). Żałuję, że nie miałem TAK w tym wieku.
jcolebrand

44

Ponieważ nikt inny tak naprawdę się Could someone please explain this to me?nie zajął , wierzę, że:

j++ jest skrótem, to nie jest faktyczna operacja (ok, to naprawdę JEST, ale proszę o wyrozumiałość dla wyjaśnienia)

j++jest naprawdę równa tej operacji, j = j + 1;z wyjątkiem tego, że nie jest makrem ani czymś, co powoduje zastąpienie w wierszu. Jest tu wiele dyskusji na temat operacji i+++++ii tego, co to oznacza (ponieważ można to zinterpretować jako i++ + ++iOR(i++)++ + i

Co prowadzi nas do: i++versus ++i. Nazywane są operatorami post-incrementi pre-increment. Czy wiesz, dlaczego tak się nazywają? Ważną częścią jest to, jak są używane w zadaniach. Na przykład możesz zrobić: j=i++;lub j=++i;Zrobimy teraz przykładowy eksperyment:

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

Jakie są wartości i, j i k?

Dam ci odpowiedzi i pozwolę ci to rozwiązać;)

i = 7, j = 5, k = 7;Taka jest siła operatorów pre i post inkrementacji oraz niebezpieczeństwa związane z ich niewłaściwym użyciem. Ale oto alternatywny sposób zapisania tej samej kolejności operacji:

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

Ok, teraz, kiedy pokazałem ci, jak ++działa operator, zastanówmy się, dlaczego nie działa w j+3... Pamiętasz, jak wcześniej nazwałem to „skrótem”? O to właśnie chodzi, zobacz drugi przykład, bo to skutecznie , co robi kompilator przed użyciem polecenia (nie jest to bardziej skomplikowane, ale to nie dla pierwszych wyjaśnień). Zobaczysz więc, że „rozwinięty skrót” zawiera i =AND, i + 1czyli wszystko, co ma Twoje żądanie.

To wraca do matematyki. Funkcja jest zdefiniowana gdzie f(x) = mx + blub równanie, y = mx + bwięc jak nazywamy mx + b... z pewnością nie jest funkcją ani równaniem. Co najwyżej jest to wyrażenie. To wszystko j+3jest wyrażeniem. Wyrażenie bez przypisania nic nam nie daje, ale zabiera czas procesora (zakładając, że kompilator go nie optymalizuje).


Mam nadzieję, że to wszystko wyjaśni i da ci trochę miejsca na zadawanie nowych pytań. Twoje zdrowie!


9

W twoim przykładzie j+=3zwiększa się o 3.

(Niewiele więcej do powiedzenia tutaj, jeśli jest to związane ze składnią, sugerowałbym najpierw Google, ale jestem tutaj nowy, więc mogę się mylić.)


3
Masz rację, ale oryginalne pytanie ma j+3które nie faktycznie przyrost j. OP powinien używać j += 3.
Greg Hewgill,

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

}

j+3nie przypisze nowej wartości do j, add j=j+3przypisze nową wartość do j, a pętla przesunie się w górę o 3.

j++jest jak mówienie j = j+1, więc w tym przypadku przypisujesz nową wartość do j, tak jak powyżej.



4

Tak powinno być

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

ale uważaj

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

lub

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

2

Po prostu spróbuj tego

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

LUB

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

1

Możesz również napisać kod jako

for(int i=0;i<n;i++)
{
      //statements;
      i=i+2;//cause you want to increment i by 3 
}

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

j ++ oznacza j = j + 1, wartość j już 0 teraz dodajemy 1, więc teraz sumaryczna wartość j + 1 stała się 1, w końcu zastępujemy wartość j (0) wartością sumaryczną (1), więc oto jesteśmy przesłanianie wartości j przez j + 1. Tak więc każda iteracja wartość j będzie zwiększana o 1.

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

Tutaj j + 3 oznacza wartość j już 0, teraz dodajemy 3, więc teraz suma j + 3 stała się 3, ale nie nadpisujemy istniejącej wartości j. Tak więc JVM pyta programistę, że obliczasz nową wartość, ale przypisujesz tę wartość zmiennej (tj. J). Dlatego otrzymujemy błąd w czasie kompilacji „nieprawidłowy AssignmentOperator”.

Jeśli chcemy zwiększyć wartość j o 3, możemy użyć jednego z następujących sposobów.

 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

Część „inkrementacji” instrukcji pętli musi zmienić wartość zmiennej indeksu, aby miała jakikolwiek skutek. Odręczną formą „++ j” jest „j = j + 1”. Tak więc, jak powiedziały inne odpowiedzi, poprawną formą Twojego przyrostu jest „j = j + 3”, co nie ma tak zwięzłego skrótu, jak zwiększanie o jeden. „j + 3”, jak już wiesz, właściwie nie zmienia j; jest to wyrażenie, którego ocena nie przynosi żadnego efektu.


0

Jeśli masz pętlę for, taką jak ta:

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

W tej pętli używasz skrótu dostarczanego przez język java, co oznacza operator postfiksowy (użyj-to-zmień), który jest równoważny z j = j + 1, więc zmieniona wartość jest inicjalizowana i używana do następnej operacji.

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

W tej pętli po prostu zwiększasz swoją wartość o 3, ale nie inicjalizujesz jej z powrotem do zmiennej j, więc wartość j pozostaje zmieniona.



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

ten format działa dla mnie zwiększając indeks o n

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

jeśli n = 4, to zwiększy się o 4

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.