码迷,mamicode.com
首页 > 编程语言 > 详细

java表达式类型的自动提升(转)

时间:2016-04-30 22:21:51      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

转自 http://www.blogjava.net/hyperjava/articles/241839.html

当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义如下的自动提升规则:
1. 所有byte型、short型和char型将被提升到int型。
2. 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如下图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。
技术分享

下面程序示范了一个典型的错误:

技术分享//定义一个short类型变量
技术分享short sValue = 5;
技术分享//表达式中的sValue将自动提升到int类型,则右边的表达式类型为int
技术分享//将一个int类型赋给short类型的变量将发生错误。
技术分享sValue = sValue - 2;
技术分享

      上面中的sValue -2表达式的类型将被提升到int类型,这样就是把右边的int型值赋给左边的short型变量,从而引起错误。

下面代码是表达式类型自动提升的正确示例代码(程序清单同上):

技术分享byte b = 40;
技术分享char c = ‘a‘;
技术分享int i = 23;
技术分享double d = .314;
技术分享//右边表达式中在最高等级操作数为d(double型)
技术分享//则右边表达式的类型为double型,故赋给一个double型变量
技术分享double result = b + c + i * d;
技术分享//将输出144.222
技术分享System.out.println(result);
技术分享


必须指出的,表达式的类型将严格保持和表达式中最高等级操作数相同的类型,下面代码中两个int整数进行除法运算,即使无法除尽,也将得到一个int结果(程序清单同上):

技术分享int val = 3;
技术分享//右边表达式中2个操作数都是int,故右边表达式的类型为int
技术分享//因此,虽然23/3不能除尽,依然得到一个int整数
技术分享int intResult = 23 / val;
技术分享//将输出7
技术分享System.out.println(intResult);

从上面程序中可以看出,当两个整数进行除法运算时,如果不能整数,得到结果将是把小数部分截断取整后的整数。

如果表达式中包含了字符串,则又是另一番情形了:因为把加号(+)放在字符串和基本类型值之间时,这个加号是一个字符串连接运算符,而不是进行加法运算。看如下代码:

技术分享//输出字符串Hello!a7
技术分享System.out.println("Hello!" + ‘a‘ + 7);
技术分享//输出字符串104Hello!
技术分享System.out.println(‘a‘ + 7 + "Hello!");

对于第一个表达式"Hello!" + ‘a‘ + 7,先进行"Hello!" + ‘a‘的运算,将把‘a‘转换成字符串,将拼接成字符串Hello!a,接着进行"Hello!a" + 7的运算,这也是一个字符串连接运算,得到结果是Hello!a7。对于第二个表达式,先进行‘a‘ + 7加法运算,其中‘a‘自动提升到int型,变成a对应的ASCII值:97,从97 + 7将得到104,然后进行104 + "Hello!",104会自动转换成字符串,将变成两个字符串的连接运算,从而得到104Hello!

 

——————————————————

PS.基础最重要!

java表达式类型的自动提升(转)

标签:

原文地址:http://www.cnblogs.com/swisszhang/p/5449429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!