呃 只有B是错误的 小心误导楼主了作者: bpsend 时间: 2013-11-18 15:41
a. byte b = 1 + 1; //正确,常量优化机制:编译器会把 byte b = 1 + 1编译成 byte b = 2;只要不超过-128至正的127就可以通过。
b. byte b = 1; b = b + 1; //编译错误,损失精度。byte、char、short的变量会转换为Int类型进行运算,得出的结果也是Int。int类型的赋值给byte类型的会损失精度。
c. byte b = 1; b = b += 1; //正确,+=赋值运算符隐含了一个强制转换,他会将结果转换为你接收的类型。
d. byte b = 1; b = ++b; //正确,这个是c和a的组合体
byte b = 1;b=++b 等于 byte b = 1;b= b+=1; 等于 byte b2 = 1; b2=(byte)(b2+1);
作者: ixiangfeng 时间: 2013-11-18 15:47
A:1+1在编译时就能确定,而且在byte范围内 正确
B:b = b + 1; b+1会自动提升为int类型 然后赋值给b,因为b是byte类型的,错误
C:b = b+=1;先进行b+=1,因为+=是java语言规定的运算符,java编译器会对它进行特殊处理,运行后还是原来的类型,赋值给b也正确,不用强转,正确
D:++和+=符号一样,正确作者: ╰ゝ冷筱柔 时间: 2013-11-18 16:00
误导楼主了,sorry,重新解释一下C选项。对于第一个运算,首先,byte b = 1;实际上这个值是编译器先进行了一次检查,范围在byte范围内,则编译通过,
同时将1这个int类型的值在底层转化为了byte类型赋给了b;
再说说b = b += 1;这个运算是将b += 1的计算结果赋给了b,所以我们只说b += 1的运算过程就行了,
b += 1,其实等价于 b = (byte)(b+1);底层会对这个结果进行强转的,所以它编译的时候没事,如果b是127,
那么加1后变成128了,成了int类型了,超过了byte类型的最大范围了,怎么办?这时候底层会强转,把int类型的
前面三个高位丢弃,丢弃后,如果剩下的一位中,最高位为1,则取反加一,就成了负数了,如果最高位为0,直接把 值赋给b 作者: ╰ゝ冷筱柔 时间: 2013-11-18 16:01
在说D选项。
b = ++b,这个运算的过程是,先进行++b的运算,再把运算后的结果赋给b,++b计算后是一个int类型的,
不管结果等于多少,底层会进行一个强转,也就是说++b就相当于 b = (byte)(b+1),所以这个编译也没有问题,作者: 明月几时有 时间: 2013-11-19 00:18
感谢各位细心回答,我知道对错,就是不知道怎么说作者: 黄炳期 时间: 2013-11-19 12:28
帖子已重新分类