浅谈java中: short s = s + 1和s += 1的
摘要
在这篇文章中,我会结合自己遇到的疑惑,分析题目中的问题,并简要总结java中数据类型相关的知识,供交流学习。
关键字
java, 数据类型, 默认类型,运算符优先级、类型溢出
正文
不知读者们是否会像作者同样的错以为:题目中两者没有啥区别!
由于我们在平时的编程中很少涉及类型溢出、优先级考虑等问题,加上林林总总的数据类型、包装类、又是单目运算符,又是三元运算符,脑子都绕晕了,所以忽略了这类问题。。。
作者最近涉及到要考虑性能、考虑存储细节才踩到这个坑。
两者的区别
short s = s + 1
s = s + 1,在s + 1的时候,结果会被“升格”为int类型。将int高级类型转为低级类型,需要强制转换,所以自然编译不会通过.
s += 1
对于“+=”操作,jvm会自动执行类型操作,等价于 s = (short)(s + 1)
说完两者的区别,作者进一步去看了一下造成这个区别的几点本质原因,总结如下。
java数据类型
在java中数据类型(byte, short, char) -> int ->long -> float -> double,从左到右低阶到高级,不同数据类型之间既有能表示范围的区别,同时由于java是强类型语言,所以严格按照(当然还有一些封装方法可以相互转换,这里不扩展,只介绍基本类型)以下规则转换:
- 隐式转换
低阶变量可以直接转换为高级变量,比如 byte b;int i = b;long l = b;float f = b;double d = b;是自动的。 - 显示转换
从高级变量转为低级变量,比如 int i = 99;byte b = (byte) i;char c = (char)i;float f = (float)i;需要程序员手动强制转换,但是要注意转换后可能丢失精度或者数据溢出。
java的默认类型
在java中,整数 默认是 int 类型,小数 默认是 double 类型 ;因此,在一些地方会造成一些错误,除了上面s + 1中的“1”编译器默认为int类型之外,还有诸如:
long num = 99999999999999; // error
编译器也是会报错的!原因是编译器把99999999999999当成int类型,然而99999999999999超出了int能表示的范围,所以改成如下就好了:
long num = 99999999999999L; // ok
运算符优先级
博大精深,无力展开,只说一点:赋值运算符“=”优先级最低,而“+=”运算符比较高,在解析s += 1的时候由于是“+=”操作符,编译器解析时先将其转换为 s = (short)(s + 1),更深层次涉及到jvm如何实现,这里可以自己去看一下。
结尾
java语言级知识博大精深,上述有不准确之处,欢迎评论区留言。另,码字不易,如果觉得对您有帮助,记得点赞或者送火箭哦(****·****)