A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Alexander 中级黑马   /  2014-3-3 18:31  /  1589 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前段时间遇到了一个问题,问题是这样的
以下代码哪个是正确的?为什么?
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所以不能赋值吗?
新人,求高手能回答,越详细越好!

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
zzkang0206 + 1 之前在论坛上看到过一个原版题目,一模一样.
滔哥 + 1

查看全部评分

10 个回复

倒序浏览
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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回
回复 使用道具 举报
这种情况对于char,short也是一样的,具体原因真没找到一个非常有说服力的,当然,时间有限,也没有去找太多资料来看待这个问题。
个人理解,结论很简单:
当右边参与运算的是常量,那在结果不超过byte的范围的情况下,是可以自动转换为byte的
而当右边参与运算的是变量,那就报错,虽然这个变量你已经定义为1,不会超过byte的范围,但是因为后面可以对变量值进行更改,所以=号右边不可以有变量参与运算。

对于这个结论,你可以定义一个final int i=1;然后b = 1+i;可以帮你更好理解这个问题。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
这道题你是不是出错了啊,我验证了只有第二个是错误的,其他的都是正确的啊
回复 使用道具 举报
在java中,对char, byte和short类型的字符串进行数学算法操作,比如+,-,>>位移操作,都会引发
自动类型提升,结果将是int类型,a+b的结果是int, 要将int的值赋给byte就必须进行类型强制转换。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Dora 中级黑马 2014-3-3 22:00:15
7#
java运算中,-=,+=,b++,b--不会出现类型的转换,而+,-,>>位移操作,都会引发
自动类型提升,所以只有第二个答案是错误的。
回复 使用道具 举报
a.两个常量相加,在-127--128之间,编译器认为一个字节可以装下不报错; b,变量b是变量,和1相加会进行类型提升int,编译器无法判断相加的结果是否会超过1个字节,就编译不通过。c,d同上,就是b是变量,无法确定,最后相加的结果也无法判断是否一个字节能装得下

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
Dora 发表于 2014-3-3 21:55
这道题你是不是出错了啊,我验证了只有第二个是错误的,其他的都是正确的啊 ...

真的吗,我在eclipse中试过,其他的直接都显示红叉,要不我再试试
回复 使用道具 举报
Alexander 发表于 2014-3-3 23:29
真的吗,我在eclipse中试过,其他的直接都显示红叉,要不我再试试

验证结果怎么样?
回复 使用道具 举报
感觉你像是弄错了吧  应该只有第二是不对的吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马