黑马程序员技术交流社区

标题: 一个关于byte的问题 [打印本页]

作者: Alexander    时间: 2014-3-3 18:31
标题: 一个关于byte的问题
前段时间遇到了一个问题,问题是这样的
以下代码哪个是正确的?为什么?
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;
后来试验了下,只有答案a是对的,不知道为什么,难道是byte参与了运算,就变成了int所以不能赋值吗?
新人,求高手能回答,越详细越好!


作者: 黄翔    时间: 2014-3-3 19:57
a.正确,隐式强制类型转换,将赋值符右边的int类型数值强制转换成赋值符左边的byte类型数值,再赋值给赋值  符左边的变量
b.错误,先定义b是byte类型,表达式左边进行运算时,因为1默认
     是int类型,那么b会自动转换成int类型,左边计算后将int类型
     的值赋给byte类型,需要强制类型转换
c.正确,先定义变量b是byte类型,又因为+=运算符优先级高于=运算符,所以经过+=运算符,b的值变为2,最   后经过隐式强制类型转换,
    byte类型变量b的值为2
d.正确,先定义变量b是byte类型,又因为++运算符优先级高于=运算
   符,所以经过++运算符,b的值变为2,最后经过隐式强制类型转换,
    byte类型变量b的值为2
作者: 黄翔    时间: 2014-3-3 19:59
隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回
作者: 乔青山    时间: 2014-3-3 20:05
这种情况对于char,short也是一样的,具体原因真没找到一个非常有说服力的,当然,时间有限,也没有去找太多资料来看待这个问题。
个人理解,结论很简单:
当右边参与运算的是常量,那在结果不超过byte的范围的情况下,是可以自动转换为byte的
而当右边参与运算的是变量,那就报错,虽然这个变量你已经定义为1,不会超过byte的范围,但是因为后面可以对变量值进行更改,所以=号右边不可以有变量参与运算。

对于这个结论,你可以定义一个final int i=1;然后b = 1+i;可以帮你更好理解这个问题。
作者: Dora    时间: 2014-3-3 21:55
这道题你是不是出错了啊,我验证了只有第二个是错误的,其他的都是正确的啊
作者: Dora    时间: 2014-3-3 21:57
在java中,对char, byte和short类型的字符串进行数学算法操作,比如+,-,>>位移操作,都会引发
自动类型提升,结果将是int类型,a+b的结果是int, 要将int的值赋给byte就必须进行类型强制转换。
作者: Dora    时间: 2014-3-3 22:00
java运算中,-=,+=,b++,b--不会出现类型的转换,而+,-,>>位移操作,都会引发
自动类型提升,所以只有第二个答案是错误的。

作者: 苏小惠    时间: 2014-3-3 22:47
a.两个常量相加,在-127--128之间,编译器认为一个字节可以装下不报错; b,变量b是变量,和1相加会进行类型提升int,编译器无法判断相加的结果是否会超过1个字节,就编译不通过。c,d同上,就是b是变量,无法确定,最后相加的结果也无法判断是否一个字节能装得下
作者: Alexander    时间: 2014-3-3 23:29
Dora 发表于 2014-3-3 21:55
这道题你是不是出错了啊,我验证了只有第二个是错误的,其他的都是正确的啊 ...

真的吗,我在eclipse中试过,其他的直接都显示红叉,要不我再试试
作者: Dora    时间: 2014-3-3 23:48
Alexander 发表于 2014-3-3 23:29
真的吗,我在eclipse中试过,其他的直接都显示红叉,要不我再试试

验证结果怎么样?
作者: 学习代码    时间: 2014-3-5 17:34
感觉你像是弄错了吧  应该只有第二是不对的吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2