国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

詳解java面試題中的i++和++i

2024-07-14 08:40:11
字體:
來源:轉載
供稿:網友

代碼如下所示:

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的元素的值放到棧頂。所以講傳入的i的值放入到棧頂,其次 iinc 0,1 表示將局部變量表中

索引為0的元素進行加1,最后是 ireturn 將棧頂的int值放入到調用者棧楨的棧中。(這里的棧都是操作數棧)

因此其實 iinc 0,1 并沒有實際影響到返回的值,所以返回依舊是10.

同理addBeforeReturn字節碼如下:

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.

如果你真正理解了上面的,這道題也很簡單,首先是在執行main之前,知道x,y的值,這里有點牽扯到類加載機制,類加載的準備階段會為static變量賦值為該類型的零值。int的話就對應0嘍,在類的初始化階段,根據代碼順序收集類中的靜態塊和靜態變量賦值行為進行生成 方法。因此該測驗中,x = 5, y = 0;

繼續分析,在執行myMethod之前執行了 x--' ,所以x = 4,y = 0, myMethod 中 y = x++ + ++x;

x++在執行后面的加操作之前是不會加1的,就跟 return i++ 在return之后才會進行i++,(這里的return 你可以理解為上面的iload入棧操作,而不是iretrun這條指令),所以第一個加數為4,但是這里需要注意的是在執行++x之前,遞增已經對實際的x生效了,即x已經為5了,所以第二個加數為 ++i 為6,從而y=10.

隨后就很簡單了 x+y+ ++x 為 6+10+7 為23。幸運的是如果你能看懂字節碼,你可以翻譯該代碼的字節碼,用字節碼來驗算,也可以發現這樣的結果。

再來看一道例子 ,是群里大佬提供的。我覺得也很針對基礎。

public static int plus(int i){  try{    ++i;    System.out.println("try");    return i++;  }finally{    System.out.println("finally");    i++;     //return i;  }}public static void main(String[] args){  System.out.println(Test1.plus(5));}

 

你能想到最后輸出的是多少嗎?如果去掉注釋呢,這也就是為什么finally塊里不要return的原因。因為無論對錯,可能永遠都返回某個值。

總結

以上所述是小編給大家介紹的詳解java面試題中的i++和++i,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘潭市| 香河县| 和平区| 彭州市| 饶阳县| 马公市| 屏东县| 金塔县| 彰化县| 区。| 金川县| 锦州市| 吉水县| 墨竹工卡县| 余姚市| 长葛市| 临洮县| 邯郸县| 普洱| 库尔勒市| 民勤县| 桂阳县| 长兴县| 洛川县| 石首市| 呼伦贝尔市| 汉沽区| 长宁区| 邵东县| 洛扎县| 贺兰县| 新和县| 尉犁县| 德令哈市| 新晃| 望城县| 区。| 秦皇岛市| 永宁县| 乌鲁木齐市| 丰顺县|