Javaでforループを作成する方法は、1以外の増分で増加します


82

このようなforループがある場合:

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

それはうまくいきます。しかし、次のようなforループがある場合:

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

それは機能しません。誰かが私にこれを説明してもらえますか?


17
ここで質問する前に、まず自分で何かを試してみると+1。
Falmarri 2011年

1
の副作用j++は?の副作用j+3は?

回答:


119

これj+3は、の値が変更されないためですj。の値が3増加するように、j = j + 3またはに置き換える必要があります。j += 3j

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

2
代わりに彼はできたint j=0; for(;j<=90;){... j+=3;}が、それは自明ではない;)
jcolebrand 2011年

6
@drachensternつまり、whileループです。
dkarp 2011年

@ dkarp〜確かに、しかし、ほとんどの人がその構文について考えていないことを見て、私はそれを指摘すると思いました。特にOPは明らかに若い年齢でJavaとプログラミングを学んでいるので(教授とリンクされたブログをチェックしてください)。その年齢でSOがあればよかったのに。
jcolebrand 2011年

44

他の誰も実際に取り組んでいないので、Could someone please explain this to me?私はそうすると信じています:

j++ 速記です、それは実際の操作ではありません(それは本当にそうですが、説明のために私に耐えてください)

j++j = j + 1;マクロやインライン置換を行うものではないことを除けば、実際には操作と同じです。ここでは、の操作i+++++iとその意味について多くの議論があります(i++ + ++iORとして解釈される可能性があるため)(i++)++ + i

これに私たちをもたらします:i++++i。それらはpost-incrementandpre-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、表現です。代入のない式は役に立ちませんが、CPU時間を消費します(コンパイラーがそれを最適化しないと仮定します)。


それがあなたのために物事を明確にし、あなたに新しい質問をする余地を与えることを願っています。乾杯!


9

あなたの例では、j+=33ずつ増加します。

(ここで言うことはあまりありません。構文に関連している場合は、最初にグーグルをお勧めしますが、ここでは新しいので、間違っている可能性があります。)


3
あなただ右が、元の質問はしていません実際に増加。OPはを使用する必要があります。j+3jj += 3
Greg Hewgill 2011年

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

}

j+3新しい値をjに割り当てず、addj=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)に割り当てます。そのため、コンパイル時エラー「invalidAssignmentOperator」が発生します。

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」であり、1ずつ増分するほど簡潔な省略形はありません。「j + 3」は、ご存じのとおり、実際にはjを変更しません。評価が効果のない式です。


0

このようなforループがある場合:

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

このループでは、Java言語によって提供される省略形を使用しています。これは、j = j + 1と同等の接尾辞演算子(use-then-change)を意味するため、変更された値が初期化され、次の操作に使用されます。

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ずつ増加します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.