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ć?
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ć?
Odpowiedzi:
To dlatego, j+3
że nie zmienia wartości j
. Musisz to zamienić na j = j + 3
lub j += 3
tak, aby wartość j
wzrosła o 3:
for (j = 0; j <= 90; j += 3) { }
int j=0; for(;j<=90;){... j+=3;}
ale to nieoczywiste;)
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+++++i
i tego, co to oznacza (ponieważ można to zinterpretować jako i++ + ++i
OR(i++)++ + i
Co prowadzi nas do: i++
versus ++i
. Nazywane są operatorami post-increment
i 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 + 1
czyli wszystko, co ma Twoje żądanie.
To wraca do matematyki. Funkcja jest zdefiniowana gdzie f(x) = mx + b
lub równanie, y = mx + b
więc jak nazywamy mx + b
... z pewnością nie jest funkcją ani równaniem. Co najwyżej jest to wyrażenie. To wszystko j+3
jest 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!
W twoim przykładzie j+=3
zwię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ć.)
j+3
które nie faktycznie przyrost j
. OP powinien używać j += 3
.
for(j = 0; j<=90; j = j+3)
{
}
j+3
nie przypisze nowej wartości do j, add j=j+3
przypisze 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.
Zmiana
for(j = 0; j<=90; j+3)
do
for(j = 0; j<=90; j=j+3)
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
}
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
}
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.
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.
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.
To tylko błąd składni. Wystarczy zamienić j+3
na j=j+3
lub j+=3
.