Javaではx ++と++ xの間に違いはありますか?


113

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


53
同じ答えの急流をキューに入れます...
skaffman

5
...そして、最初の同一の回答に
賛成票

9
最悪の場合は略奪品に移動し、古い順に並べ替えて、[上へ]をクリックします。おおほhoほ。
dotjoe 2009

1
私はそれを持っていると確信していた!エミールの答えはとにかく良いです。
ビクター

回答:


290

++ 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

62
良い説明、1 ++。
エラー

67

はい

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

例:

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

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


10
+1たくさんの例、これは例付きの説明です:)
ジェレミー・スミス

1
ええ、私はまた、冒頭の明確な散文の説明のためにこれを賛成することになりました。(うーん、今日のコメントで筆記体を
使える

17

これらは、後置演算子および前置演算子として知られています。どちらも変数に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

そうじゃないのsuffix
HyperNeutrino 2015年

10

はい、

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

印刷し6

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

印刷されます5


1
@トム、私は投票方法を検討していたので、ここに私の解釈を示します。エミールHの回答を好む小さな理由の1つは、彼のサンプルコードが/やや/より有益であることです。
ジョニック2009

ジョニック。True、キーワード「preincrement」と「postincrement」も含まれます。
トム

この「答え」はテストケースの出力を伝えるだけであり、出力は答えではないと考えています。それどころか、通常、一部のコード実行の(予期しない)結果が問題を引き起こします。したがって、私の反対票。
アルベルトデパオラ

8

私はその最近の子犬の 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仮想マシン仕様の助けを借りてmainメソッドにコメントすることを許可しました):

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

7

コンピュータが実際に何をするかを考えるとき...

++ 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を使用します。これは非常に簡単です。


5

Java ではx ++と++ xの間に違いあります

++ xはプレフィックス形式です。 変数式をインクリメントし、式の新しい値を使用します。

たとえば、コードで使用する場合:

int x = 3;

int y = ++x;
//Using ++x in the above is a two step operation.
//The first operation is to increment x, so x = 1 + 3 = 4
//The second operation is y = x so y = 4

System.out.println(y); //It will print out '4'
System.out.println(x); //It will print out '4'

x ++は後置形式です: 変数の値は最初に式で使用され、次に操作の後に増分されます。

たとえば、コードで使用する場合:

int x = 3;

int y = x++;
//Using x++ in the above is a two step operation.
//The first operation is y = x so y = 3
//The second operation is to increment x, so x = 1 + 3 = 4

System.out.println(y); //It will print out '3'
System.out.println(x); //It will print out '4' 

これが明確であることを願っています。上記のコードを実行して再生すると、理解に役立つはずです。


3

はい。

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);
    }
}

2

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

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


2

他の多くの言語と同じように、簡単に試してみることをお勧めします。

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

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


2

はい、返される値は、それぞれ増分後および増分前の値です。

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

1

さて、私は最近クラシックスタックの実装を確認したときに同じ問題に遭遇したため、ここに着陸しました。これはスタックの配列ベースの実装で使用されていることを思い出してください。これはリンクリストの実装よりも少し高速です。

以下のコードで、プッシュとポップの機能を確認してください。

public class FixedCapacityStackOfStrings
{
  private String[] s;
  private int N=0;

  public FixedCapacityStackOfStrings(int capacity)
  { s = new String[capacity];}

  public boolean isEmpty()
  { return N == 0;}

  public void push(String item)
  { s[N++] = item; }

  public String pop()
  { 
    String item = s[--N];
    s[N] = null;
    return item;
  }
}

1

はい、違いがあります。x++(postincrement)の場合、xの値は式で使用され、xは式が評価された後に1ずつインクリメントされます。一方、++ x(preincrement)、x +式では1が使用されます。例を挙げましょう:

public static void main(String args[])
{
    int i , j , k = 0;
    j = k++; // Value of j is 0
    i = ++j; // Value of i becomes 1
    k = i++; // Value of k is 1
    System.out.println(k);  
}

1

質問はすでに回答されていますが、私の側から追加することもできます。

まず、++は1ずつ増加することを意味し、-は1ずつ減少することを意味します。

ここで、x ++はこの行の後にインクリメントxを意味し、++ xはこの行の前にインクリメントxを意味します。

この例を確認してください

class Example {
public static void main (String args[]) {
      int x=17,a,b;
      a=x++;
      b=++x;
      System.out.println(“x=” + x +“a=” +a);
      System.out.println(“x=” + x + b=” +b);
      a = x--;
      b = --x;
      System.out.println(“x=” + x + a=” +a);
      System.out.println(“x=” + x + b=” +b);
      }
}

次の出力が得られます。

x=19 a=17
x=19 b=19
x=18 a=19
x=17 b=17

1
この応答は、いくつかの単語の説明を伴う場合はさらに良いでしょう。
Thom

0

i ++では、これはポストインクリメントと呼ばれ、値はその後インクリメントされるコンテキストで使用されます。++ iは、事前に値をインクリメントしてから、コンテキストで使用します。

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


0

大きな違いがあります。

ほとんどの回答がすでに理論を指摘しているので、簡単な例を指摘したいと思います。

int x = 1;
//would print 1 as first statement will x = x and then x will increase
int x = x++;
System.out.println(x);

今見てみましょう++x

int x = 1;
//would print 2 as first statement will increment x and then x will be stored
int x = ++x;
System.out.println(x);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.