Wie man Schleifen in Java erstellt, erhöht sich um andere Schritte als 1

81

Wenn Sie eine for-Schleife wie diese haben:

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

Es funktioniert gut. Aber wenn Sie eine for-Schleife wie diese haben:

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

es funktioniert nicht Könnte mir das bitte jemand erklären?

TomLisankie
quelle
17
+1 für das Ausprobieren selbst, bevor Sie hier fragen.
Falmarri
1
Die Nebenwirkung von j++ist? Die Nebenwirkung von j+3ist?

Antworten:

118

Das liegt daran, j+3dass sich der Wert von nicht ändert j. Sie müssen dies durch j = j + 3oder ersetzen, j += 3damit der Wert von jum 3 erhöht wird:

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

quelle
2
Alternativ könnte er, int j=0; for(;j<=90;){... j+=3;}aber das ist nicht offensichtlich;)
jcolebrand
6
@drachenstern Mit anderen Worten, eine while-Schleife.
Dkarp
@dkarp ~ In der Tat, aber da die meisten Leute nicht über diese Syntax nachdenken, dachte ich, ich würde darauf hinweisen. Zumal das OP offensichtlich schon in jungen Jahren Java und Programmierung lernt (siehe Profee und den verlinkten Blog). Ich wünschte, ich hätte SO in diesem Alter gehabt.
Jcolebrand
44

Da sich sonst niemand wirklich darum gekümmert hat, Could someone please explain this to me?glaube ich:

j++ ist eine Abkürzung, es ist keine tatsächliche Operation (ok, es ist wirklich, aber nehmen Sie mit mir für die Erklärung)

j++ist wirklich gleich der Operation, j = j + 1;außer dass es sich nicht um ein Makro oder etwas handelt, das eine Inline-Ersetzung durchführt. Hier gibt es viele Diskussionen über die Funktionsweise i+++++iund was dies bedeutet (weil es als i++ + ++iOP interpretiert werden könnte(i++)++ + i

Was uns bringt zu: i++versus ++i. Sie heißen die Operatoren post-incrementund pre-increment. Können Sie sich vorstellen, warum sie so benannt sind? Der wichtige Teil ist, wie sie in Aufgaben verwendet werden. Zum Beispiel könnten Sie Folgendes tun: j=i++;oder j=++i;Wir werden jetzt ein Beispielexperiment durchführen:

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

Was sind die Werte von i, j und k?

Ich gebe dir die Antworten und lass es dich ausarbeiten;)

i = 7, j = 5, k = 7;Das ist die Macht der Operatoren vor und nach dem Inkrementieren und die Gefahr, sie falsch zu verwenden. Aber hier ist die alternative Art, dieselbe Reihenfolge zu schreiben:

// 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, jetzt, da ich Ihnen gezeigt habe, wie der ++Operator funktioniert, wollen wir untersuchen, warum er nicht funktioniert j+3... Erinnern Sie sich, wie ich ihn früher als "Kurzschrift" bezeichnet habe? Das ist es ja, das zweite Beispiel sehen, denn das ist effektiv , was der Compiler tut , bevor Sie den Befehl (es ist komplizierter als das, aber das ist nicht für die ersten Erklärungen). Sie werden also sehen, dass die "erweiterte Kurzschrift" i =UND enthält, i + 1was alles ist, was Ihre Anfrage hat.

Das geht zurück auf Mathe. Eine Funktion ist definiert, wo f(x) = mx + boder eine Gleichung, y = mx + balso wie nennen wir mx + b... es ist sicherlich keine Funktion oder Gleichung. Es ist höchstens ein Ausdruck. Was alles j+3ist, ist ein Ausdruck. Ein Ausdruck ohne Zuweisung nützt uns nichts, nimmt aber CPU-Zeit in Anspruch (vorausgesetzt, der Compiler optimiert ihn nicht).


Ich hoffe, das klärt die Dinge für Sie und gibt Ihnen Raum, neue Fragen zu stellen. Prost!

jcolebrand
quelle
9

In Ihrem Beispiel j+=3erhöht sich um 3.

(Hier gibt es nicht viel zu sagen, wenn es um die Syntax geht, würde ich zuerst Googeln vorschlagen, aber ich bin neu hier, damit ich mich irren kann.)

Connor
quelle
3
Sie haben Recht, aber die ursprüngliche Frage hat, j+3was nicht wirklich erhöht j. Das OP sollte verwenden j += 3.
Greg Hewgill
8
for(j = 0; j<=90; j = j+3)
{

}

j+3wird j den neuen Wert nicht zuweisen, add j=j+3wird j den neuen Wert zuweisen und die Schleife wird um 3 nach oben verschoben.

j++ist wie gesagt j = j+1, in diesem Fall weisen Sie j den neuen Wert genau wie oben zu.

Abraham Adam
quelle
6

Veränderung

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

zu

for(j = 0; j<=90; j=j+3)
Aravind Yarram
quelle
4

Es sollte so sein

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

aber pass auf

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

oder

for(int j = 0; j<=90; j = j + 3)
Konz Mama
quelle
2

Probieren Sie es einfach aus

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

ODER

for(int i=0; i<5; i+=2){//value increased by 2
//body
}
Abdul Basit Rishi
quelle
1

Sie können auch Code schreiben als

for(int i=0;i<n;i++)
{
      //statements;
      i=i+2;//cause you want to increment i by 3 
}
Prajakta Grünkohl
quelle
1
for(j = 0; j<=90; j++){}

j ++ bedeutet j = j + 1, j Wert bereits 0, jetzt addieren wir 1, also wurde der Summenwert von j + 1 zu 1, schließlich überschreiben wir den j-Wert (0) mit dem Summenwert (1), also sind wir hier Überschreiben des j-Werts um j + 1. Jeder Iterationswert j wird also um 1 erhöht.

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

Hier bedeutet j + 3, dass der j-Wert bereits 0 ist, jetzt addieren wir 3, so dass der Summenwert von j + 3 jetzt 3 wird, aber wir überschreiben den vorhandenen j-Wert nicht. Damit JVM den Programmierer fragt, berechnen Sie den neuen Wert, aber wo Sie diesen Wert einer Variablen zuweisen (dh j). Aus diesem Grund wird der Kompilierungsfehler "ungültiger AssignmentOperator" angezeigt.

Wenn wir den j-Wert um 3 erhöhen möchten, können wir eine der folgenden Möglichkeiten verwenden.

 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.  
Gopi Rajkumar
quelle
0

Der "Inkrement" -Teil einer Schleifenanweisung muss den Wert der Indexvariablen ändern, um eine Wirkung zu erzielen. Die Langform von "++ j" ist "j = j + 1". Wie andere Antworten bereits sagten, ist die korrekte Form Ihres Inkrements "j = j + 3", was keine so knappe Abkürzung hat wie das Inkrementieren um eins. "j + 3" ändert, wie Sie inzwischen wissen, j nicht wirklich; Es ist ein Ausdruck, dessen Bewertung keine Wirkung hat.

warrenm
quelle
0

Wenn Sie eine for-Schleife wie diese haben:

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

In dieser Schleife verwenden Sie eine Kurzform, die von der Java-Sprache bereitgestellt wird. Dies bedeutet einen Postfix-Operator (use-then-change), der j = j + 1 entspricht, sodass der geänderte Wert initialisiert und für die nächste Operation verwendet wird.

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

In dieser Schleife erhöhen Sie Ihren Wert nur um 3, initialisieren ihn jedoch nicht zurück in die Variable j, sodass der Wert von j geändert bleibt.

shraddha bhardwaj
quelle
0

Es ist nur ein Syntaxfehler. Sie müssen nur j+3durch j=j+3oder ersetzen j+=3.

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

Dieses Format funktioniert für mich, indem ich den Index um n erhöhe

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

Wenn n = 4, wird dies um 4 erhöht

Cj Oyales
quelle