web-dev-qa-db-ja.com

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

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

104
erickreutz

++ 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
275
Emil H

はい

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

例:

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

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

62
Victor

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

はい、

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

6を印刷し、

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

5を出力します。

11
Johannes Weiss

私はここに最近の dup 'sの1つから着陸しました。この質問には答え以上のものがありますが、コードを逆コンパイルして「まだ別の答え」を追加せざるを得ませんでした:-)

正確であるため(そして、おそらく少し面倒です)、

int y = 2;
y = y++;

にコンパイルされます:

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

javac this Y.Javaクラスの場合:

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

およびjavap -c Yを取得すると、次のjvmコードが得られます( Java Virtual Machine Specification を使用してメインメソッドにコメントすることができました)。

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
8
Alberto

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

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

6
Cornell

In 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' 

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

4
Jeremy Levett

はい。

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);
    }
}
3
Carl Manaster

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

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
2
Lars Haugseth

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

X = 9の場合、++ Xを使用すると、値10が使用され、そうでない場合は値9が使用されます。

2
nojevive

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

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

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

2
flq

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

まず、++は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
Saif

OK、私は最近、古典的なスタックの実装をチェックするときに同じ問題に出くわしたので、ここに行きました。これはStackの配列ベースの実装で使用されていることを思い出してください。LinkedListよりも少し高速です。

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

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
kasaquan

はい、違いがあります。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
Rohit Goyal

大きな違いがあります。

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

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);
0
Pritam Banerjee

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

コンテキストで使用しない場合は、何を使用しても構いませんが、慣例によりpostincrementが使用されます。

0
takra