コードは次のようになります:
public class testplusplus {public static void main(string [] args){int k = addafterreturn(10); System.out.println(k); //出力10 int k1 = addbeforereturn(10); System.out.println(k1); //出力11} public static int addbeforereturn(int i){return ++ i; } public static int addafterreturn(int i){return i ++; }}バイトコードレベルから、
addafterreturnのバイトコードは次のとおりです。
0:ILOAD_01:IINC 0、14:IRETURN
単純です。ILOAD_0は、ローカル変数テーブルのインデックス付けされた要素の値をスタックの上部に0に配置することを意味します。したがって、私が渡された値はスタックの上部に配置され、IINC 0,1はローカル変数テーブルを配置することを意味します
インデックス0の要素が1に追加され、最終的にIreturnはINT値をスタックの上部に発信者のスタックフレームに入れます。 (ここのスタックはオペランドスタックです)
したがって、IINC 0と1は実際には返品値に影響しないため、返品はまだ10です。
同様に、addbeforereturn bytecodeは次のとおりです。
0:IINC 0、13:ILOAD_04:IRETURN
私は彼ら自身の分析のためにそれを皆に任せます。実際、これが最初に増加してからスタックに入れていることは明らかです。したがって、返された値は実際に増加します。
それでは、私が自分自身を修正したインタビューの質問をしましょう。
public class testplusplus2 {static {x = 5; int y = 10; } static int x、y; public static void main(string args []){x--; mymethod(); System.out.println(x+y+++ x); } public static void mymethod(){y = x +++++ x; }}答えを知っていますか?それを実行すると、正解は23です。
上記を本当に理解している場合、この質問も非常に簡単です。まず、メインを実行する前にxとyの値を知っています。これには、クラスロードメカニズムが含まれます。クラスロードの準備段階は、このタイプのゼロ値に静的変数を割り当てます。 intがintの場合、それは0に対応します。クラスの初期化段階では、クラスの静的ブロックと静的変数割り当て動作は、メソッドを生成するためのコード順序に従って収集されます。したがって、このテストでは、x = 5、y = 0;
分析を続けてください、 x--' ,所以x = 4,y = 0, myMethod 中y = x++ + ++x;
X ++は、後続の追加操作を実行する前に1を追加しません。リターン後にのみI ++を返すように(Iloadスタック操作はIretrun命令ではなく上記の操作として理解できます)、最初の追加は4ですが、++ Xを実行する前に、実際のXに拡大するXはすでにY = 10です。
次に、非常に単純なx+y +++ xは6+10+7 is 23です。幸いなことに、bytecodeを理解できれば、コードのバイトコードを翻訳してバイトコードを使用してそれを確認できます。また、そのような結果も見つけることができます。
グループの大物によって提供された別の例を見てみましょう。それは非常に基本的なものだと思います。
public static int plus(int i){try {++ i; system.out.println( "try"); I ++を返します。 }最後に{system.out.println( "fully"); i ++; // return i; }} public static void main(string [] args){system.out.println(test1.plus(5));}最終出力はいくらですか?コメントを削除した場合、これが最終的なブロックに戻らない理由です。それが正しいか間違っているかに関係なく、特定の値が常に返される可能性があるためです。
要約します
上記は、編集者が紹介したJavaインタビューの質問におけるI ++および++ Iの詳細な説明です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!