私は Java の学習を始めたばかりで、今は for ループ ステートメントに夢中です。forループでどのよう++i
に機能するかわかりません。i++
足し算や引き算などの数学演算ではどのように機能しますか?
どちらも数値を増やします。++i
と同等i = i + 1
です。
i++
と++i
非常に似ていますが、まったく同じではありません。どちらも数値を増やし++i
ますが、現在の式が評価される前に数値を増やしi++
ますが、式が評価された後に数値を増やします。
int i = 3;
int a = i++; // a = 3, i = 4
int b = ++a; // b = 4, a = 4
サンプルクラスは次のとおりです。
public class Increment
{
public static void main(String [] args)
{
for (int i = 0; i < args.length; ++i)
{
System.out.println(args[i]);
}
}
}
javap.exe を使用してこのクラスを逆アセンブルすると、次のようになります。
Compiled from "Increment.java"
public class Increment extends java.lang.Object{
public Increment();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
}
ループを変更して i++ を使用し、再度逆アセンブルすると、次のようになります。
Compiled from "Increment.java"
public class Increment extends java.lang.Object{
public Increment();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
}
2つを比較すると、TextPadは2つが同一であると教えてくれます。
これは、生成されたバイト コードの観点からは、ループに違いがないことを示しています。他のコンテキストでは、++i と i++ に違いがありますが、for ループには違いはありません。
どちらも変数i
を 1 増やします。と言っているようなものi = i + 1
です。違いは微妙です。このようなループで使用している場合、違いはありません:
for (int i = 0; i < 100; i++) {
}
for (int i = 0; i < 100; ++i) {
}
違いを知りたい場合は、次の例を見てください。
int a = 0;
int b = a++; // b = 0; a = 1
a = 0;
b = ++a: // b = 1; a = 1
アイデアは、その値を++a
インクリメントa
して返す一方でa++
、 a の値を返し、次にインクリメントするというものa
です。
for ループの処理方法は次のとおりです。
1 まず、初期化を行います (i=0)
2 チェックが実行されます (i < n)
3 ループ内のコードが実行されます。
4 値がインクリメントされます
5 手順 2 ~ 4 を繰り返します
これが、使用されている for ループで i++ と ++i の違いがない理由です。
違いは、ポスト インクリメント オペレータはインクリメント前の状態でi++
戻り、プレインクリメント オペレータはインクリメント後にそのまま戻ることです。典型的なループについて質問している場合:i
++i
i
for
for (i = 0; i < 10; i++)
また
for (i = 0; i < 10; ++i)
i++
or++i
をより大きな式の一部として使用していないため、それらはまったく同じです。
i++
とはどちら++i
も の省略形ですi = i + 1
。
i++
i の値を変更するだけでなく、1 を追加する前 ( ) または1 を追加した後 ( ) に、i の値も返します++i
。
ループの 3 番目のコンポーネントは、各反復の後に実行されるコードです。
for (int i=0; i<10; i++)
その部分の値は使わないので、上記はそのまま
for(int i=0; i<10; i = i+1)
また
for(int i=0; i<10; ++i)
それが違いを生む場所(との間i++
)++i
は、これらの場合です
while(i++ < 10)
for (int i=0; i++ < 10; )
JLS§14.14.1、The basic for Statementは、 ForUpdate式が評価され、値が破棄されることを明確にしています。for
その効果は、ステートメントのコンテキストで 2 つの形式を同一にすることです。