两小无猜的爱恨情仇--java =+和+=揭秘
故事背景
当一个人问另一个人“敢不敢”的时候,另一个人必须说“敢”,这就是游戏的规则。小男孩朱利安和小女孩苏菲的相遇即开始于这样一场孩童的闹剧,一个精美的铁盒子就是他们游戏的见证。说脏话,扰乱课堂,在校长室小便,内衣外穿,一个游戏两人一玩十多年,他们什么都敢,除了承认彼此相爱。
苏菲(玛丽昂·歌迪亚饰)提议两人分别十年,挑战的内容是朱利安(吉约姆·卡内饰)敢不敢伤害苏菲。恍惚十年逝去,朱利安找到苏菲,为了游戏的进行他决定另娶她人,邀请苏菲做伴娘。受到伤害的苏菲在朱利安的婚礼上抛出铁盒子“你敢悔婚么?”原本最最亲密的朋友相互伤害最深。同样心痛的两个人相约再次分别十年。
十年里,朱利安拥有了一切,家庭、事业、朋友,只是没了苏菲宛如没了心,原来丧失激情的生活这般索然无味。
终于十年过去,“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 =+和+=揭秘的更多相关文章
- 注解:大话AOP与Android的爱恨情仇
转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...
- String、StringBuilder、StringBuffer的爱恨情仇
第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...
- Menu与ActionBar的爱恨情仇
最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...
- web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决
[问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...
- 除了love和hate,还能怎么表达那些年的“爱恨情仇”?
实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...
- 对json的爱恨情仇
本文回想了对json的爱恨情仇. C++有风险,使用需慎重. 本文相关代码在:http://download.csdn.net/detail/baihacker/7862785 当中的測试数据不在里面 ...
- [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!
探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...
- Tidyverse|数据列的分分合合,爱恨情仇
Tidyverse|数据列的分分合合,爱恨情仇 本文首发于“生信补给站”Tidyverse|数据列的分分合合,一分多,多合一 TCGA数据挖掘可做很多分析,前期数据“清洗”费时费力但很需要. 比如基因 ...
- pytorch和tensorflow的爱恨情仇之基本数据类型
自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...
随机推荐
- P1603 斯诺登的密码-字符串加法的妙用
传送门:https://www.luogu.org/problemnew/show/P1603 题意: 首先在给定的字符串中,找出特定的单词,把它转化成特定的数字, 然后在这些数字中,找出排列结果最小 ...
- 模板汇总——treap
1. 旋转treap. 思想:一颗权值BST + 一颗 随机数 最小堆. BZOJ - 3224 代码: #include<bits/stdc++.h> using namespace s ...
- Codefroces 920F SUM and REPLACE(线段树)
SUM and REPLACE 题意:给你n个数,进行m次操作,分别是将区间[l,r]内的所有数替换成自己的因子数 和 对区间[l,r]进行求和. 题解:可以发现2的因子个数还是2,1的因子个数还是1 ...
- poj2528 Mayor's posters(线段树区间修改+特殊离散化)
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- codeforces 810 D. Glad to see you!(二分+互动的输入方式)
题目链接:http://codeforces.com/contest/810/problem/D 题意:两个人玩一场游戏要猜出Noora选的f种菜的任意两种.一个人猜点另一个人回答 TAK如果 ,(x ...
- hdu1255 覆盖的面积(线段树面积交)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 面积交与面积并相似相比回了面积并,面积交一定会有思路,当然就是cover标记大于等于两次时. 但 ...
- CF980B Marlin 构造 思维 二十四
Marlin time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- poj 2115 求线性同余方程 C Looooops(好理解欧几里德扩展定理怎么应用)
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29061 Accepted: 8360 Descr ...
- 现代 JavaScript 教程到底是什么?
手册与规范 <现代 JavaScript 教程>是开源的现代 JavaScript 从入门到进阶的优质教程,它旨在帮助你逐渐掌握 JavaScript 这门语言.但是一旦你已经熟悉了这门语 ...
- Allegro PCB导入DXF文件详解
一:导入方法 1.确认Allegro PCB的单位精度设置和DXF文件保持一致(一般情况下DXF文件用mm,Allegro文件用mil). 2. 在Allegro中点击File→Import→DXF… ...