26

私は Java の学習を始めたばかりで、今は for ループ ステートメントに夢中です。forループでどのよう++iに機能するかわかりません。i++

足し算や引き算などの数学演算ではどのように機能しますか?

4

7 に答える 7

55

どちらも数値を増やします。++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
于 2010-02-23T02:16:07.377 に答える
44

サンプルクラスは次のとおりです。

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 ループには違いはありません。

于 2010-02-23T02:36:58.207 に答える
21

どちらも変数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です。

于 2010-02-23T02:18:54.180 に答える
7

for ループの処理方法は次のとおりです。

1 まず、初期化を行います (i=0)

2 チェックが実行されます (i < n)

3 ループ内のコードが実行されます。

4 値がインクリメントされます

5 手順 2 ~ 4 を繰り返します

これが、使用されている for ループで i++ と ++i の違いがない理由です。

于 2010-02-23T03:18:55.533 に答える
5

違いは、ポスト インクリメント オペレータはインクリメントの状態でi++戻り、プレインクリメント オペレータはインクリメント後にそのまま戻ることです。典型的なループについて質問している場合:i++iifor

for (i = 0; i < 10; i++)

また

for (i = 0; i < 10; ++i)

i++or++iをより大きな式の一部として使用していないため、それらはまったく同じです。

于 2010-02-23T02:17:04.730 に答える
3

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; )
于 2010-02-23T02:16:58.373 に答える
0

JLS§14.14.1、The basic for Statementは、 ForUpdate式が評価され、値が破棄されることを明確にしています。forその効果は、ステートメントのコンテキストで 2 つの形式を同一にすることです。

于 2010-02-23T04:13:11.007 に答える