青梅竹馬的愛恨情仇--java =+和+=揭祕

故事背景html

  當一我的問另外一我的「敢不敢」的時候,另外一我的必須說「敢」,這就是遊戲的規則。小男孩朱利安和小女孩蘇菲的相遇即開始於這樣一場孩童的鬧劇,一個精美的鐵盒子就是他們遊戲的見證。說髒話,擾亂課堂,在校長室小便,內衣外穿,一個遊戲兩人一玩十多年,他們什麼都敢,除了認可彼此相愛。java

蘇菲(瑪麗昂·歌迪亞飾)提議兩人分別十年,挑戰的內容是朱利安(吉約姆·卡內飾)敢不敢傷害蘇菲。恍惚十年逝去,朱利安找到蘇菲,爲了遊戲的進行他決定另娶她人,邀請蘇菲作伴娘。受到傷害的蘇菲在朱利安的婚禮上拋出鐵盒子「你敢悔婚麼?」本來最最親密的朋友相互傷害最深。一樣心痛的兩我的相約再次分別十年。程序員

十年裏,朱利安擁有了一切,家庭、事業、朋友,只是沒了蘇菲宛如沒了心,原來喪失激情的生活這般索然無味。express

終於十年過去,「Love me, if you dare...」。oracle

青梅竹馬的愛恨情仇--java =+和+=揭祕

 

java =+和+=揭祕ui

java有兩對關係密切的對象,=+和+=,許多程序員都會認爲表達式(x += i)只是表達式(x =x + i)的簡寫方式,真的是這樣嗎?請看程序:lua

 public static void main(String[] args) {
 short x = 0;
 int i = 123456;
 x += i;
 System.out.println(x);
 }

這個程序的結果是什麼?spa

運行後結果是:code

-7616orm

青梅竹馬的愛恨情仇--java =+和+=揭祕

 

不急,來看下面的程序:

    public static void main(String[] args) {
        short x = 0;
        int i = 123456;
        i =x + i;
        System.out.println(i);
    }

結果如咱們預期:

123456

探究緣由

在jsl15.26中定義,=是簡單的賦值表達式,+=是複雜的賦值表達式,其中+=表達式知足規則:A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

(複合賦值操做符包括 +=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=和|=)Java 語言規範中講到,複合賦值 E1 op= E2 等價於簡單賦值E1 =(T)((E1)op(E2)),其中T 是E1 的類型,除非E1 只被計算一次。

舉例以下:

short x = 3;
x += 4.6;

等同於

short x = 3;
x = (short)(x + 4.6);

分析例一

 short x = 0;
 int i = 123456;
 x += i;

等同於

 short x = 0;
 int i = 123456;
 x =(short)(x+ i);

第一步,x+i結果是int,第二步是int轉short是窄化,會丟失精度。獲得-7616就能夠理解了

分析例二

        short x = 0;
        int i = 123456;
        i =x + i;

i是int類型,x是short類型,若是是x=x+i編譯不能經過,報錯:

Type mismatch: cannot convert from int to short

若是使用i=x+i則沒有問題,結果爲12345

青梅竹馬的愛恨情仇--java =+和+=揭祕

 

參考資料

【1】https://baike.baidu.com/item/%E4%B8%A4%E5%B0%8F%E6%97%A0%E7%8C%9C/1674468

【2】https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.26

【3】java解惑

相關文章
相關標籤/搜索