先上一道题:

java 实现corn表达式解析_操作数



想要正确解答这道题,需要知道Java表达式转型规则:



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

java 实现corn表达式解析_操作数_02

 

结合实例详细讲解Java表达式转型规则:

1、操作数中有double、float、long的时候,按照最高的类型进行转换



double a = 1.0;
int b = 3;



那么 a+b 为double型
2、如果没有这几种,则byte、char、short都转化为int



byte a = 1;
byte b = -2;



那么 a+b 为int型
3、final修饰的变量不会转换类型,但是进行操作的时候,操作结果依据左操作数的类型进行转换



byte a = 1;
final byte b = 2;



那么 a+b 为int型(虽然b不会改变类型,依据左边的a的类型而定结果类型,但是a会自动提升为int型)

4、表达式类型自动提升的正确示例代码



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



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



//输出字符串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!。

 

答案解析:本题答案应为:B、C、D

语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;
语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型;
语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);
语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变