web-dev-qa-db-ja.com

Javaのforループを1以外の増分で増やす方法

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

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

正常に動作します。しかし、次のようなforループがある場合:

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

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

67
TomLisankie

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

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

誰も実際にCould someone please explain this to me?に取り組んだことがないので、私はそうするつもりです:

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

j++は、マクロまたはインライン置換を行うものではないことを除き、操作j = j + 1;と実際に同じです。ここでi+++++iの操作とその意味について多くの議論があります(i++ + ++i OR (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で機能しない理由を調べましょう。それだけです。2番目の例を参照してください。これは、効果的にコマンドを使用する前にコンパイラが行うことです(それよりも複雑ですが、最初の説明ではありません)。そのため、「拡張された速記」にはi = AND i + 1があり、これがリクエストのすべてです。

これは数学に戻ります。関数はf(x) = mx + bまたは方程式y = mx + bで定義されているので、mx + bと呼ぶものは...関数または方程式ではありません。せいぜい式です。これはすべてj+3である式です。割り当てのない式は役に立たないが、CPU時間を消費する(コンパイラが最適化しないと仮定)。


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

39
jcolebrand

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

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

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

}

j+3はjに新しい値を割り当てません。j=j+3を追加するとjに新しい値が割り当てられ、ループは3つ上に移動します。

j++j = j+1と言っているので、その場合は上記のようにjに新しい値を割り当てます。

7
Abraham Adam

変化する

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

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

こんな感じ

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)
4
Konz Mama

このような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(int i=0; i<5; i=i+2){//value increased by 2
//body
}

OR

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

ループ文の「増分」部分は、インデックス変数の値を変更して効果を持たせる必要があります。 「++ j」の長形式は「j = j + 1」です。したがって、他の答えが言っているように、増分の正しい形式は「j = j + 3」であり、1ずつ増分するほど簡潔ではありません。 「j + 3」は、ご存知の通り、実際にはjを変更しません。評価の効果がない式です。

0
warrenm
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がプログラマーに要求するように、新しい値を計算していますが、その値をvariable(i.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
Gopi Rajkumar