javaで++xとx++に違いはありますか?
17 に答える
++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
はい
++x は x の値をインクリメントしてから x を返します
x++ は x の値を返し、次にインクリメントします
例:
x=0;
a=++x;
b=x++;
コードを実行すると、a と b の両方が 1 になりますが、x は 2 になります。
これらは、後置演算子および前置演算子として知られています。どちらも変数に 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
はい、
int x=5;
System.out.println(++x);
印刷さ6
れます
int x=5;
System.out.println(x++);
印刷されます5
。
最近の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
コンピュータが実際に何をしているのかを考えると...
++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 を使用するだけです。この方がずっと簡単です。
はい。
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);
}
}
はい、++X を使用すると、式で X+1 が使用されます。X++ を使用すると、式で X が使用され、式が評価された後にのみ X が増加します。
したがって、X = 9 の場合、++X を使用すると値 10 が使用され、それ以外の場合は値 9 が使用されます。
他の多くの言語と同様の場合は、簡単に試してみてください。
i = 0;
if (0 == i++) // if true, increment happened after equality check
if (2 == ++i) // if true, increment happened before equality check
上記がそのように起こらない場合、それらは同等である可能性があります
はい、返される値は、それぞれインクリメントの前後の値です。
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
i++ では、これはポストインクリメントと呼ばれ、値はどのようなコンテキストでも使用され、インクリメントされます。++i はプリインクリメントで、最初に値をインクリメントしてからコンテキストで使用します。
どのコンテキストでも使用していない場合は、何を使用してもかまいませんが、慣例によりポストインクリメントが使用されます。