java表达式类型的自动提升

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

答案是:前者错,后者对。

Java的8种基本数据类型及其所占用的空间

      boolean  8bit/1byte

      byte      8bit/1byte
      char      16bit/2byte
      short     16bit/2byte
  float      32bit/4byte
      int        32bit/4byte
      long      64bit/8byte
      double  64bit/8byte

当一个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!。

例:

 
byte b1=1,b2=2,b3,b6; 
 final byte b4=4,b5=6; 
 b6=b4+b5; 
 b3=(b1+b2);   //会发生编译错误
 System.out.println(b3+b6);

猜你喜欢

转载自blog.csdn.net/lzh_86/article/details/80336859