黑马程序员技术交流社区
标题:
一道转型的面试题!求解!
[打印本页]
作者:
余银桂
时间:
2012-6-19 20:41
标题:
一道转型的面试题!求解!
本帖最后由 余银桂 于 2012-6-20 10:02 编辑
int i=99;
System.out.println(true?'a':99999);
System.out.println(true?'a':99); //重点是这个
System.out.println(true?'a':i);
//第一个和第二个的输出结果很费解,这是为什么?
复制代码
int i=99;
System.out.println('a'+99999);
System.out.println('a'+99);
System.out.println('a'+i);
//还有这个
复制代码
byte d = 20;
byte e = 30;
byte f = d + e;
//那这个呢?
复制代码
作者:
吴扬
时间:
2012-6-19 20:52
本帖最后由 吴扬 于 2012-6-19 20:53 编辑
因为char类型的数据参与运算首选会被向上提升为int类型再参与运算,所以第一段和第二段代码不会报错,字符a会被转换成int类型,编译通过
第三段代码会报错,因为byte类型的数据参与运算首先被向上提升为int类型的,参与运算之后再赋值给byte类型的f就会报错。要强制转换数据类型的。
byte d = 20;
byte e = 30;
byte f = (byte)(d + e);
作者:
王月
时间:
2012-6-19 21:28
除了LZ说的那个重点,其他的都要用到基本数据类型的转型,int类型以下的包括byte、char、short类型的数据在运算时都要转换成int型才能参加运算。所以最后的结果都是int型。而这个,byte f=d+e; 这是把d 和 e转型为int后,进行相加运算再把和赋给byte类型f,肯定会损失精度啊。
还有这个,true?a:99;,我也不明白为什么结果是a,纠结中。
作者:
耿鑫
时间:
2012-6-19 21:47
很简单看看就明白了
?:运算的后两项类型要相同,而且低精度向高精度自动转换,char在java中是以 两字节表示且非负,所以可以取的范围是0~65535
第一个true ? 'a' : 99999,因为99999大于65535,前面的'a'会被强转成int(因为后面的不能转成char了,否则会有精度损失),所以?:的结果是int,因此是97。
第二个true ? 'a' : 99,因为99小于65535,编译器会根据第一个'a'认为99也是char,所以?:的结果是char,因此是a ,不信你可以把99改成65536,结果输出就和上边一样是97.
第三个true ? 'a' : i,i是变量,明确了就是个int,'a'被低精度向高精度转,?:返回的是int,因此是97
下面3个不用解释了吧?
作者:
郑冬
时间:
2012-6-19 22:28
类型自动转换顺序为(byte,short,char)-->int-->long-->float—>double,这样第一段第二段很容易理解
第三个,byte f=d+e; d 和 e转型为int后,进行相加运算把和赋给byte类型f,会损失精度。
作者:
胡卿
时间:
2012-6-19 22:29
java中的运算都是默认由低精度向高精度转换
true ? 'a' : 99999 因为'a'是一个字符,字符的值是unicode值,范围是0~65535,而字符'a'对应的值是97,因为99999超过65535,所以比较时,要将'a'转换为与99999一样的int型,三元运算,前面boolean值为true,就返回前面一个,也就是'a',而'a'已经被转为int型,因此结果就为97.
true ? 'a' : 99 其实正好和上面相反,99小于65535,所以99默认为字符,也就是对于的字符'c',因此返回结果为字符a
最后一个因为i已经被定义为int型,所以结果和第一个一样
第二题和第一题原理是一样的,如果不明白值对应的字母,就去查ASCII码表
第三题
byte b=20,因为20为int型,int型转换为字节型会损失精度,编译会失败,这种情况需要强制转换
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2