130

javaで++xとx++に違いはありますか?

4

17 に答える 17

324

++x はプリインクリメントと呼ばれ、x++ はポストインクリメントと呼ばれます。

int x = 5, y = 5;

System.out.println(++x); // outputs 6
System.out.println(x); // outputs 6

System.out.println(y++); // outputs 5
System.out.println(y); // outputs 6
于 2009-07-07T21:09:57.477 に答える
71

はい

++x は x の値をインクリメントしてから x を返します
x++ は x の値を返し、次にインクリメントします

例:

x=0;
a=++x;
b=x++;

コードを実行すると、a と b の両方が 1 になりますが、x は 2 になります。

于 2009-07-07T21:10:27.147 に答える
19

これらは、後置演算子および前置演算子として知られています。どちらも変数に 1 を追加しますが、ステートメントの結果には違いがあります。

int x = 0;
int y = 0;
y = ++x;            // result: y=1, x=1

int x = 0;
int y = 0;
y = x++;            // result: y=0, x=1
于 2009-07-07T21:13:01.433 に答える
12

はい、

int x=5;
System.out.println(++x);

印刷さ6れます

int x=5;
System.out.println(x++);

印刷されます5

于 2009-07-07T21:10:13.450 に答える
9

最近のdupの 1 つからここにたどり着きました。この質問には回答以上のものがありますが、コードを逆コンパイルして「さらに別の回答」を追加せずにはいられませんでした :-)

正確に言うと(そしておそらく、少し衒学的に)、

int y = 2;
y = y++;

次のようにコンパイルされます。

int y = 2;
int tmp = y;
y = y+1;
y = tmp;

javacこのY.javaクラスの場合:

public class Y {
    public static void main(String []args) {
        int y = 2;
        y = y++;
    }
}

そしてjavap -c Y、次のjvmコードを取得します(Java仮想マシン仕様の助けを借りてメインメソッドにコメントすることを許可しました):

public class Y extends java.lang.Object{
public Y();
  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_2 // Push int constant `2` onto the operand stack. 

   1:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.

   2:   iload_1  // Push the value (`2`) of the local variable at index `1` (`y`)
                 // onto the operand stack

   3:   iinc  1, 1 // Sign-extend the constant value `1` to an int, and increment
                   // by this amount the local variable at index `1` (`y`)

   6:   istore_1 // Pop the value on top of the operand stack (`2`) and set the
                 // value of the local variable at index `1` (`y`) to this value.
   7:   return

}

したがって、最終的には次のようになります。

0,1: y=2
2: tmp=y
3: y=y+1
6: y=tmp
于 2012-08-24T14:25:46.290 に答える
9

コンピュータが実際に何をしているのかを考えると...

++x: メモリから x を読み込み、インクリメントし、使用し、メモリに保存します。

x++: メモリから x をロードし、使用し、インクリメントし、メモリに保存します。

考慮してください: a = 0 x = f(a++) y = f(++a)

ここで、関数 f(p) は p + 1 を返します

x は 1 (または 2) になります

y は 2 (または 1) になります

そしてそこに問題があります。コンパイラの作成者は、取得後、使用後、または格納後にパラメータを渡しましたか。

一般に、x = x + 1 を使用するだけです。この方がずっと簡単です。

于 2016-06-04T02:23:07.403 に答える
4

はい。

public class IncrementTest extends TestCase {

    public void testPreIncrement() throws Exception {
        int i = 0;
        int j = i++;
        assertEquals(0, j);
        assertEquals(1, i);
    }

    public void testPostIncrement() throws Exception {
        int i = 0;
        int j = ++i;
        assertEquals(1, j);
        assertEquals(1, i);
    }
}
于 2009-07-07T21:12:41.997 に答える
3

はい、++X を使用すると、式で X+1 が使用されます。X++ を使用すると、式で X が使用され、式が評価された後にのみ X が増加します。

したがって、X = 9 の場合、++X を使用すると値 10 が使用され、それ以外の場合は値 9 が使用されます。

于 2009-07-07T21:11:03.700 に答える
3

他の多くの言語と同様の場合は、簡単に試してみてください。

i = 0;
if (0 == i++) // if true, increment happened after equality check
if (2 == ++i) // if true, increment happened before equality check

上記がそのように起こらない場合、それらは同等である可能性があります

于 2009-07-07T21:11:18.877 に答える
3

はい、返される値は、それぞれインクリメントの前後の値です。

class Foo {
    public static void main(String args[]) {
        int x = 1;
        int a = x++;
        System.out.println("a is now " + a);
        x = 1;
        a = ++x;
        System.out.println("a is now " + a);
    }
}

$ java Foo
a is now 1
a is now 2
于 2009-07-07T21:12:44.053 に答える
0

i++ では、これはポストインクリメントと呼ばれ、値はどのようなコンテキストでも使用され、インクリメントされます。++i はプリインクリメントで、最初に値をインクリメントしてからコンテキストで使用します。

どのコンテキストでも使用していない場合は、何を使用してもかまいませんが、慣例によりポストインクリメントが使用されます。

于 2015-05-18T17:21:53.190 に答える