本帖最后由 Mr_Free 于 2013-7-31 04:11 编辑
哥们,我也有这道题目,我是这样写的- package com.itheima;
- /**
- * 第一题:以下代码那个是正确的?为什么?
- * a. byte b = 1 + 1;
- * b. byte b = 1;b = b + 1;
- * c. byte b=1; b= b+=1;
- * d. byte b= 1; b = ++b;
- * @author 谢伟光
- *
- *答:a,C,d是正确的。
- *分析:数据类型转换:分为自动类型转换和强制类型转换
- *数据类型的转换优先级是:double>float>long>int>byte,short,char
- *所以这里是优先级高的int类型转换为优先级低的byte类型,需要进行显示类型转换,也就是强制转换。
- *赋值运算分为2种:
- *1,等号右边全是由常量和运算符组成的表达式:因为都是常量,所以虚拟机在编译期就能知道表达式的结果,
- *并判断结果是否在被赋值的变量的类型范围内,如果在则直接赋值,如果不在则需要强制转换。
- *2,等号右边有变量参与运算:如果参与运算的变量是byte、short、char,它们会先转变为int类型,
- *再参与运算,类型总是会提升,言外之意就是一定要强转,你一定要手动写(byte)。
- *
- *
- *b 错是因为定义的是是byte类型的 所以是一个8位的数值范围,而b+1中这个1默认的为int型,
- *也就是说这个1为4个8位的数据类型,在2个不同数据类型进行运算时,数据范围小的数
- *据类型将自动转换成数据范围大的数据类型,所以,b+1之后的结果会被提升为int型,无法赋值给byte类型,而等
- *号前面的b是byte型的,jvm在编译的时候会报缺失数据精度的错误。
- *如果要改的话 可以改成 b. byte b = 1; b = (byte)(b + 1);
- *
- *在下面的代码中我会分析那些对的语句
- */
- public class Test1 {
- public static void main(String[] args){
- byte a = 1 + 1;//1+1=2,因为等号右边是都是常量,所以虚拟机在编译期就能知道要表达式的结果,
- // 判断结果是否在被赋值的变量类型范围内,运算结果是2,在8位二进制取值范围也就是-128到127范围内的,
- // 不需要强转,所以是正确的。
- // byte b = 1;b = (byte) (b + 1);//这样改了之后b+1就强制从int型转换成byte类型了。
- byte c = 1;c = c += 1;//这句话中c+=1只做了一个赋值运算,内部会做一个自动强转动作,结果存入C中,所以是正确的。
- byte d = 1; d= ++d;//这句话就是执行了对内存中d进行加1操作后存入内存中的d,所以也不会出现数据类型被转换,所以也是正确的。
- // 总结:其实其他3个对的原因是他们都符合我前面说的赋值运算的第二种情况,而且运算结果都没有越界,所以编译通过。
- }
- }
复制代码 |