故事背景

  当一个人问另一个人“敢不敢”的时候,另一个人必须说“敢”,这就是游戏的规则。小男孩朱利安和小女孩苏菲的相遇即开始于这样一场孩童的闹剧,一个精美的铁盒子就是他们游戏的见证。说脏话,扰乱课堂,在校长室小便,内衣外穿,一个游戏两人一玩十多年,他们什么都敢,除了承认彼此相爱。

苏菲(玛丽昂·歌迪亚饰)提议两人分别十年,挑战的内容是朱利安(吉约姆·卡内饰)敢不敢伤害苏菲。恍惚十年逝去,朱利安找到苏菲,为了游戏的进行他决定另娶她人,邀请苏菲做伴娘。受到伤害的苏菲在朱利安的婚礼上抛出铁盒子“你敢悔婚么?”原本最最亲密的朋友相互伤害最深。同样心痛的两个人相约再次分别十年。

十年里,朱利安拥有了一切,家庭、事业、朋友,只是没了苏菲宛如没了心,原来丧失激情的生活这般索然无味。

终于十年过去,“Love me, if you dare...”。

java =+和+=揭秘

java有两对关系密切的对象,=+和+=,许多程序员都会认为表达式(x += i)只是表达式(x =x + i)的简写方式,真的是这样吗?请看程序:

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

这个程序的结果是什么?

运行后结果是:

-7616

不急,来看下面的程序:

    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

参考资料

【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解惑

两小无猜的爱恨情仇--java =+和+=揭秘的更多相关文章

  1. 注解:大话AOP与Android的爱恨情仇

    转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...

  2. String、StringBuilder、StringBuffer的爱恨情仇

    第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...

  3. Menu与ActionBar的爱恨情仇

    最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...

  4. web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决

    [问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...

  5. 除了love和hate,还能怎么表达那些年的“爱恨情仇”?

    实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...

  6. 对json的爱恨情仇

    本文回想了对json的爱恨情仇. C++有风险,使用需慎重. 本文相关代码在:http://download.csdn.net/detail/baihacker/7862785 当中的測试数据不在里面 ...

  7. [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!

    探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...

  8. Tidyverse|数据列的分分合合,爱恨情仇

    Tidyverse|数据列的分分合合,爱恨情仇 本文首发于“生信补给站”Tidyverse|数据列的分分合合,一分多,多合一 TCGA数据挖掘可做很多分析,前期数据“清洗”费时费力但很需要. 比如基因 ...

  9. pytorch和tensorflow的爱恨情仇之基本数据类型

    自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...

随机推荐

  1. P1603 斯诺登的密码-字符串加法的妙用

    传送门:https://www.luogu.org/problemnew/show/P1603 题意: 首先在给定的字符串中,找出特定的单词,把它转化成特定的数字, 然后在这些数字中,找出排列结果最小 ...

  2. 模板汇总——treap

    1. 旋转treap. 思想:一颗权值BST + 一颗 随机数 最小堆. BZOJ - 3224 代码: #include<bits/stdc++.h> using namespace s ...

  3. Codefroces 920F SUM and REPLACE(线段树)

    SUM and REPLACE 题意:给你n个数,进行m次操作,分别是将区间[l,r]内的所有数替换成自己的因子数 和 对区间[l,r]进行求和. 题解:可以发现2的因子个数还是2,1的因子个数还是1 ...

  4. poj2528 Mayor's posters(线段树区间修改+特殊离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  5. codeforces 810 D. Glad to see you!(二分+互动的输入方式)

    题目链接:http://codeforces.com/contest/810/problem/D 题意:两个人玩一场游戏要猜出Noora选的f种菜的任意两种.一个人猜点另一个人回答 TAK如果 ,(x ...

  6. hdu1255 覆盖的面积(线段树面积交)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 面积交与面积并相似相比回了面积并,面积交一定会有思路,当然就是cover标记大于等于两次时. 但 ...

  7. CF980B Marlin 构造 思维 二十四

    Marlin time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  8. poj 2115 求线性同余方程 C Looooops(好理解欧几里德扩展定理怎么应用)

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29061   Accepted: 8360 Descr ...

  9. 现代 JavaScript 教程到底是什么?

    手册与规范 <现代 JavaScript 教程>是开源的现代 JavaScript 从入门到进阶的优质教程,它旨在帮助你逐渐掌握 JavaScript 这门语言.但是一旦你已经熟悉了这门语 ...

  10. Allegro PCB导入DXF文件详解

    一:导入方法 1.确认Allegro PCB的单位精度设置和DXF文件保持一致(一般情况下DXF文件用mm,Allegro文件用mil). 2. 在Allegro中点击File→Import→DXF… ...