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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吃饭工作睡觉 中级黑马   /  2015-11-3 08:03  /  7473 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3黑马币
public class Test {
    public static void main(String[] args) {
        byte b = 5;
        b++;
        System.out.println(b);
        
        b = b + 1;
        System.out.println(b);
    }
}
为什么b++不会报错,而b=b+1会报错呢?

23 个回复

正序浏览
没有加强制转换,因为计算机操作1是Int类型的,所以把等号后面的就转换成了int类型,你要用byte强制转换回来才不会报错
回复 使用道具 举报
b=b+1;在计算的时候会把b提升为int型,结果自然就是int型,把int型赋给byte型当然就报错了,而++包含了强制类型转换,所以就不报错了
回复 使用道具 举报
b++ 有强制类型转换回自动将byte类型转为int 类型,但是b=b+1中1为int加入b=127就会超出byte 的-128到-127的取值范围
回复 使用道具 举报
Jared 中级黑马 2015-11-6 23:42:28
20#
因为b++属于一次运算符,java会把b+1之后的结果自动转换回byte,而b=b+1属于二次运算,b+1结果是int类型,不会自动转换成byte,所以再把这个结果赋值给b会发生类型错误
回复 使用道具 举报
ㄒㄢㄨん 发表于 2015-11-6 23:11
b=b+i,因为1的默认数据类型是int型,在进行运算是会将byte型的b提升为int类型.两个int类型的变量或值相加不 ...

而++  是默认自带强转的
回复 使用道具 举报
b=b+i,因为1的默认数据类型是int型,在进行运算是会将byte型的b提升为int类型.两个int类型的变量或值相加不能用byte类型的变量接收
回复 使用道具 举报
2235510 发表于 2015-11-5 21:07
举例,int a=1
b=a++  结果是b=1;a=2
b=++a结果是b=2;a=2

可是“6”也在byte范围内啊!
回复 使用道具 举报
举例,int a=1
b=a++  结果是b=1;a=2
b=++a结果是b=2;a=2
其实就是a++是先赋值,在自身运算
             ++a是先自身运算,在赋值,
你也可以这样记下来,b=a++,先b=a在a+1,
                               b=++a 先a+1在b=(a+1),希望对你有帮助!
回复 使用道具 举报
一开始就定义 b为byte 型,因为b++ 是byte类型相加,所以不会报错;但是b=b+1 等号左边的b 是byte性,等号右边的b+1 中的1是属于int型,b+1所以已经自动转换为int 型,因此将将int 型数据赋给byte型数据就会报错。在数据byte 有效数据的范围下 可以强行转换数据,如 b=(byte)(b+1)
回复 使用道具 举报
b++; 相当于 b += 1;(+=,-=,*=,/= ,%=)称为符合赋值运算符,他们 默认包含了强制类型转换。
而b = b + 1;    当byte与int类型混合运算时,byte会自动提升为int类型,一个结果为int的赋值给byte,报错,会损失精度。
回复 使用道具 举报
在这里 b是byte  ,而 1是int型, 而b+1相加是 int 型的,int型是不能直接赋值给byte 类型,需要强制类型转换,把int类型强制转换成 byte类型。如:b=byte(b + 1);则不会报错。
回复 使用道具 举报
少年,报的错应该就是类型转换异常把,要学会看错误原因。。
回复 使用道具 举报
b会自动提升为int型
回复 使用道具 举报
1、byte、short、char这几个精度小于int的基础类型,在运算的时候会自动转化为int型参与运算,所以b=b+1;实际上是把一个int型赋值给byte型,当然报错(损失精度);
2、而b++;或者b+=1;在运算时,编译器的执行会自动加上强制转换,操作类似于 b = (byte)(b+1);所以不会报错

所以可以这么想,JAVA鼓励使用++或者+=,因为里面包含了一些类型的适配
回复 使用道具 举报
整数默认为int类型,而b为byte类型。b=b+1中,b+1结果为int类型,,int强转为byte类型可能会损失精度;而b+=1运算时有隐式转换b=byte(b+1)。希望能帮到你
回复 使用道具 举报
java里int占4个字节   byte占1个字节  前面加一个强制转换就可以了
回复 使用道具 举报
第一,b++是一次运算,会自动类型转换,所以不会报错;
第二,b=b+1是两次运算,b+1,1由于默认是是int类型,b你指定为byte类型,在b+1时会自动类型提升为int,运算后再赋值给b(byte类型)就会报错,所以要自己手动进行强转动作b=(byte)(b+1)
回复 使用道具 举报
本帖最后由 一生1314 于 2015-11-3 16:14 编辑

b= b+ 1报错是因为,b 会自动转换为int类型的值,在输出的时候,会出现  "缺失精度" 的问题,需要将 b = b+1强转后才可以使用

解题.png (89.25 KB, 下载次数: 252)

解题.png
回复 使用道具 举报
b=b+1 前面的b默认会定义为int型 这是关键
回复 使用道具 举报
b=b+1;能自动类型提升!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马