两小无猜的爱恨情仇--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的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...
随机推荐
- 【HDU5409】CRB and Graph 边双联通 子树最值
HDU # 题意 有一个简单图,n个点,m条边.对于每条割边,求出删去这条边后,在两个联通块中各取一个u,v.使得u<v,并且u尽量大而v尽量小. # 思路 求出边双联通是肯定的. 答案的限制条 ...
- andriod开发--使用Http的Get和Post方式与网络交互通信
package com.example.a350773523.myapplication; import android.os.AsyncTask; import android.support.v7 ...
- 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...
- Codeforces Round #381 (Div. 2) C. Alyona and mex(无语)
题目链接 http://codeforces.com/contest/740/problem/C 题意:有一串数字,给你m个区间求每一个区间内不含有的最小的数,输出全部中最小的那个尽量使得这个最小值最 ...
- 在Linux中增加swap空间
转自: http://blog.csdn.net/chinalinuxzend/article/details/1759593 在Linux中增加swap空间 在安装Linux的时候,不知道swap空 ...
- np问题(大数阶乘取模)
转自 np问题 题目描述: LYK 喜欢研究一些比较困难的问题,比如 np 问题. 这次它又遇到一个棘手的 np 问题.问题是这个样子的:有两个数 n 和 p,求 n 的阶乘对 p 取模后的结果. L ...
- mybatis 批量插入时候的一个注意点
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys=&quo ...
- c语言实现字符指针(字符串)数组的排序
需求: "ff555d", "114ddd", "114dd","aaa", "aaab", &qu ...
- mapper文件中“添加一条新数据并返回此数据的ID(主键)”的方法
在mapper文件的insert语句前加上<selectKey>标签即可 如下: 添加前测试: 添加后测试:
- 洛谷 P1091合唱队列
吾王剑之所指,吾等心之所向 ——<Fate/stay night> 题目:https://www.luogu.org/problem/P ...