浅谈java中: short s = s + 1和s += 1的

2018-12-06  本文已影响0人  进击的NULL

摘要

在这篇文章中,我会结合自己遇到的疑惑,分析题目中的问题,并简要总结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是强类型语言,所以严格按照(当然还有一些封装方法可以相互转换,这里不扩展,只介绍基本类型)以下规则转换:

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语言级知识博大精深,上述有不准确之处,欢迎评论区留言。另,码字不易,如果觉得对您有帮助,记得点赞或者送火箭哦(****·****)

上一篇下一篇

猜你喜欢

热点阅读