ITeyeの上で“10人、8人はこの問題を説明しません”の招待状


元帖リンク:http://www.iteye.com/topic/1117960
簡単に言えば、LZは次のJavaコードを説明するように要求し、xはなぜ最後に1なのか.
Integer x = 1;
x = x++;
System.out.println(x);

いずれにしても、この問題は悪くないと思います.この投稿は最後に隠されました.実はこの投稿には「タイトル党」はありません.ITeyeの風潮はますます浮ついていると言わざるを得ないが、なぜ心を静めてよく議論しようとしないのか、少なくとも理由を与えて証拠を与え、勝手に隠すのではなく証拠を与えなければならない.
OK、本題に入ります.
ここでは表面的にはx++についての議論であるが,実際にはJavaにおける自動梱包の問題にも関与している.
まず『The Java Language Specification,Third Edition』の15.14.2 Postfix Increment Operator++の説明を見ます.
A postfix expression followed by a++ operator is a postfix increment expression. The result of the postfix expression must be a variable of a type that is convertible (§5.1.8) to a numeric type, or a compile-time error occurs. The type of the postfix increment expression is the type of the variable. The result of the postfix increment expression is not a variable, but a value.
At run time, if evaluation of the operand expression completes abruptly, then the postfix increment expression completes abruptly for the same reason and no incrementation occurs. Otherwise, the value 1 is added to the value of the variable and the sum is stored back into the variable. Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored. The value of the postfix increment expression is the value of the variable before the new value is stored.
Note that the binary numeric promotion mentioned above may include unboxing conversion (§5.1.8) and value set conversion (§5.1.13). If necessary, value set conversion is applied to the sum prior to its being stored in the variable.
ここでは,(1)解体(unboxing conversion);(2)変数の値を1つ加算し、この変数に格納する.(3)この式の値は、新しい値を変数に戻す前の変数の値である.(4)梱包(boxing conversion).
Javaコードでx=x++を表します.
int int_x = x.intValue();
int exprValue = int_x;
int_x = int_x + 1;
Integer integer_exprValue = Integer.valueOf(exprValue);
x = integer_exprValue;

実際にclassファイルからもわかります.
 0 iconst_1
 1 invokestatic #2 <java/lang/Integer.valueOf>
 4 astore_1
 5 aload_1
 6 astore_2
 7 aload_1
 8 invokevirtual #3 <java/lang/Integer.intValue>
11 iconst_1
12 iadd
13 invokestatic #2 <java/lang/Integer.valueOf>
16 dup
17 astore_1
18 astore_3
19 aload_2
20 astore_1
21 getstatic #4 <java/lang/System.out>
24 aload_1
25 invokevirtual #5 <java/io/PrintStream.println>
28 return

PS:JavaEyeを発見した当初、CSDNの没落を嘆いていたが、今度はITeyeの番だとは思わなかった.しかし、ITeyeにはRednaxelaFX、wenshao、icyfenixなどの大牛がいます.より多くの良いフォーラムが現れることを心から望んでいます~同時にいくつかの良い技術フォーラムを推薦することを求めます