java ++i、i++、i++ + ++i、i++ + i++原理

先上代碼:

public static void main(String args[]) {int A = 1;int B = 10;int C = 100;int D = 1000;System.out.println(A++);System.out.println(++B);System.out.println(C++ + C++);System.out.println(C);System.out.println(D++ + ++D);System.out.println(D);}

在來運行結果:

1
11
201
102
2002
1002Process finished with exit code 0

Reason:

前兩個可能大家都比較容易理解,我們這里只簡單的介紹后兩個原因:

(1)C++ + C++:

      36: iload_337: iinc          3, 140: iload_341: iinc          3, 144: iadd45: invokevirtual #3 // Method java/io/PrintStream.println:(I)V48: getstatic     #2 // Field java/lang/System.out:Ljava/io/PrintStream;51: iload_352: invokevirtual #3 // Method java/io/PrintStream.println:(I)V55: getstatic     #2 // Field java/lang/System.out:Ljava/io/PrintStream;

上面是(1)相關操作的JVM字節碼:

36-iload_3操作:JVM首先將局部變量表中位置為3的元素(即100)壓入棧頂。

37-iinc 3, 1操作:然后將局部變量表中位置為3的元素的值進行了+1的操作,注意此時棧頂元素的值并未變化,仍為100。

40-iload_3操作:JVM再次將局部變量表中位置為3的元素(即101)壓入棧頂。

41-iinc 3, 1操作:然后再次將局部變量表中位置為3的元素的值進行了+1的操作,此時局部變量表中位置為3的元素的值變成102。

44-iadd操作:將棧頂的兩個元素101及100相加再次壓入棧頂,此時棧頂元素變成了201.

45、48操作:print棧頂元素的值,結果輸出201

51-iload_3操作:將局部變量表中位置為3的元素(即102)壓入棧頂。

52、55操作:print棧頂元素的值,結果輸出102

(2)D++ + ++D:

      58: iload         460: iinc          4, 163: iinc          4, 166: iload         468: iadd69: invokevirtual #3 // Method java/io/PrintStream.println:(I)V72: getstatic     #2 // Field java/lang/System.out:Ljava/io/PrintStream;75: iload         477: invokevirtual #3 // Method java/io/PrintStream.println:(I)V

上面是(2)相關操作的JVM字節碼:

58-iload_4操作:JVM首先將局部變量表中位置為4的元素(即1000)壓入棧頂。

60-iinc 4, 1操作:然后將局部變量表中位置為4的元素的值進行了+1的操作,注意此時棧頂元素的值并未變化,仍為1000。

63-iinc 4, 1操作:JVM再次將局部變量表中位置為4的值進行了+1的操作,此時值變成了1002。

66--iload_4操作:JVM再次將局部變量表中位置為4的元素壓入棧頂。

68-iadd操作:將棧頂的兩個元素1002及1000相加再次壓入棧頂,此時棧頂元素變成了2002.

69、72操作:print棧頂元素的值,結果輸出2002

75-iload_4操作:將局部變量表中位置為4的元素(即1002)壓入棧頂。

52、55操作:print棧頂元素的值,結果輸出1002

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451070.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個判斷session是否過期的小技巧

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Session一直是我們做web項目經常使用的,以前沒太注意,這次又細致的看了下! 1.session其實就是一個Ma…

擴展方法

擴展方法是寫在靜態類中,且方法是靜態方法。 不限制參數的數量。 不限制返回類型。 不限制可使用擴展方法的類型。 和普通方法編寫相似,唯一不同的是每一個擴展方法都必須有一個固定的參數。statc void Method( this DataType name&#xff0…

cpu執行命令方式

(一)有序處理器 早期的處理器為有序處理器(In-order processors),有序處理器處理指令通常有以下幾步: 指令獲取如果指令的輸入操作對象(input operands)可用(例如已經在寄存器中了&#xff09…

jQuery基礎-事件

只能添加一個處理函數,后面的會覆蓋前面 會有兼容性差異 冒泡 會依次檢查父元素 截獲冒泡 或者 最大的缺陷 并且在IE和NetSpace里面分別為冒泡和捕獲兩種 多個處理函數 依次執行 捕獲--->自己--->冒泡 true 只捕獲,不冒泡 false 只冒泡 從父元素的…

別的AI還在打游戲,這個AI已經當上“超級馬里奧”游戲策劃了|GECCO最佳論文

AI打游戲已經不是什么新鮮事了,“沉迷”Dota 2、星際爭霸、LOL的AI一個接一個的出現。 但是你也許不知道,相比這些“游戲玩家”AI,還有一位優秀的AI,直接當起了“游戲策劃”,做的還是膾炙人口的“超級馬里奧”。 &…

單點登錄的三種實現方式

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 單點登錄SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,用戶在一處登錄后,…

快速判斷數組中每個對象同一屬性值是否相同

做批量查詢的時候,要確定數組中的多個對象下的字符串是否能全部匹配,這時需要在匹配的名稱對象中通過字段記錄該名稱是否匹配。 const search [ { name: B, isExistence: false },{ name: C, isExistence: false } ]; 這時要確定 search 是否全部匹配上…

java對象占用內存大小?

一個不包含任何內部成員變量的空Object大約占33byte,若增加成員變量,則增加相應大小的內存占用。 測算方式:設置jvm的堆大小為1m,在堆中不停new不含任何成員變量的OOMObject對象,直到堆內存溢出。如下圖,在…

Java程序員面試中的多線程問題

很多核心Java面試題來源于多線程(Multi-Threading)和集合框架(Collections Framework),理解核心線程概念時,嫻熟的實際經驗是必需的。這篇文章收集了 Java 線程方面一些典型的問題,這些問題經常被高級工程師所問到。 0.Java 中多線程同步是什…

SpringBoot2使用WebFlux函數式編程

本文只是簡單使用SpringBoot2使用WebFlux的函數式編程簡單使用,后續會繼續寫關于Webflux相關的文章。 最近一直在研究WebFlux,后續會陸續出一些相關的文章。 首先看一下Srping官網上的一張圖,對比一下SpringMvc和Spring WebFlux,如…

單點登錄原理與簡單實現

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、單系統登錄機制 1、http無狀態協議 web應用采用browser/server架構,http作為通信協議。http是無狀態協議,瀏…

java接口類支持多繼承

一個類只能extends一個父類,只能有一個父類,但可以implements多個接口。java通過使用接口的概念來取代C中多繼承。與此同時,一個接口則可以同時extends多個接口,卻不能implements任何接口。Java中的接口是支持多繼承的。

xmind-HTTP協議

轉載于:https://www.cnblogs.com/margot921/p/9764788.html

彈性布局

彈性布局 一、Flex布局是什么? Flex是Flexible Box的縮寫,意為”彈性布局”,用來為盒狀模型提供最大的靈活性。任何一個容器都可以指定為Flex布局。 二、基本概念 采用Flex布局的元素,稱為Flex容器(flex container&…

Java-Type簡單分類

&#xff08;1&#xff09;ParameterizedType&#xff1a; 參數化類型&#xff0c;例如List<T>。 &#xff08;2&#xff09;GenericArrayType&#xff1a; 泛型數組類型&#xff0c;例如T[]。 &#xff08;3&#xff09;TypeVariable&#xff1a; 泛型的類型變量&a…

解決dataTable 報錯:cannot read property “style“ of undefined

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 其實這錯&#xff0c;我之前也遇到過&#xff0c;只是太久了&#xff0c;沒有記錄下來&#xff0c; 今天看到群里朋友也遇到這個錯誤&a…

萬惡之源 - Python基礎數據類型一

整數 整數在Python中的關鍵字用int來表示; 整型在計算機中運于計算和比較 在32位機器上int的范圍是: -2**31&#xff5e;2**31-1&#xff0c;即-2147483648&#xff5e;2147483647 在64位機器上int的范圍是: -2**63&#xff5e;2**63-1&#xff0c;即-9223372036854775808&…

談談對于技術面試的心得體驗

導讀&#xff1a;作者lzprgmr寫了一篇《談談技術面試》文章&#xff0c;他在文中講述了自己對于技術人員面試的經驗和心得&#xff0c;以下是文章內容&#xff1a; 只要是招一個技術人員&#xff0c;不管是初級的程序員還是高級軟件工程師&#xff0c;技術上的考核都必不可少。…

es6中class類的全方面理解(三)------靜態方法

不需要實例化類&#xff0c;即可直接通過該類來調用的方法&#xff0c;即稱之為“靜態方法”。將類中的方法設為靜態方法也很簡單&#xff0c;在方法前加上static關鍵字即可。這樣該方法就不會被實例繼承&#xff01; class Box{static a(){return "我是Box類中的&#xf…

jackson/fastJson boolean類型問題

1.我們以Person對象舉個栗子&#xff0c;person有三個屬性。name&#xff0c;age和isGay Data public class Person {public Person(String name, int age, boolean isGay) {this.name name;this.age age;this.isGay isGay;}private String name;private Integer age;priva…