表达式类型的陷阱

  Java语言规定:当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java语言中的自动提升规则如下:

  • 所有byte型、short型和char型将被提升为int型

  • 这个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如下所示:


例子:

public class Main {
public static void main(String args[]) {
    //定义一个short类型的变量
    short s=4;
    //表达式中的s将自动提升到int类型,则右边的表达式类型为int
    //将一个int类型赋给short类型的变量时将发生错误
    s=s-2;
    byte b=2;
    char c='a';
    int i=23;
    double d=.324;
    //右边表达式中在最高等级操作数为d(double型)
    //则右边表达式的类型为double型,故赋给一个double型变量
    double result=b+c+i*d;
    System.out.println(result);
    int val=3;
    //右边表达式中2个操作数都是int,故右边表达式的类型为int
    //因此,虽然23/3不能除尽,依然得到一个int整数
    int intResult=23/val;
    System.out.println(intResult);
    //程序自动将7、'a'等基本类型转化为字符串,输出字符串Hello!a7
    System.out.println("Hello!"+'a'+7);
    //程序将'a'当成int处理,因此'a'+7得到104,输出字符串104Hello!
    System.out.println('a'+7+"Hello!");
  }
}

  在复合赋值运算符中有点不同,由前面的介绍可知,下面的语句会引起编译错误:

short s=4;
s=s-2;

因为s-2表达式的类型将自动提升为int类型,所以程序将一个int类型的变量赋给s时导致了编译错误。但是下面形式就没有任何问题:

short s=4;
s-=2;

上面的表达式使用了复合赋值运算符,此时将不会产生编译错误。Java语言几乎允许所有的双目运算符和=一起结合成复合赋值运算符,如+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=、|=等。根据Java语言规范,复合赋值运算符包含了一个隐式的类型转换,即:

a+=5;

等价于

a=(a的类型)(a+5);

也就是说,复合赋值运算符会自动地将它计算的结果值强制类型转换为其左侧变量的类型,强制类型转换将有可能导致高位"截断"。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 表达式 表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合...
    劼哥stone阅读 587评论 0 4
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,258评论 9 118
  • 关于字符串的陷阱 JVM对字符串的处理 首先看如下代码: 上面创建了两个字符串对象,其中一个是“HelloJack...
    Jack921阅读 959评论 0 1
  • 37岁的我,还是想做很多事情,不想每天这样过,来得及吗? 1.我想陪着孩子长大,给他们做好吃的,哪怕不太多,周末也...
    匆匆不离去阅读 404评论 0 1
  • 引言:项目需求不同应用之间的相互调用,类似分享到微信、QQ、新浪微博应用之间的调用等,废话不多说,记录一下,心得体...
    ibabyblue阅读 1,259评论 0 2