表达式类型的陷阱

  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);

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

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