java eclipse软件为什么可以运行c1+=4;但是对c1=c1+4;进行报错

图片说明

c1=c1+4 表示一个char类型+int类型,这时候char会被自动提升结果类型为int,再把int类型的值赋给char类型则出错,如若要这么写 得将c1强制转换类型。
但c1+=4不会改变c1的类型 所以赋值可以成功

c1+=4,默认的是char 的运算,所以c1='C'会被转换成ASCII码对应的数值,由于确定了强转的类型是char,最后c1+=4就是一个字符。
而c1=c1+4,在右边是进行数学运算,左边c1是char类型,右边是int类型,类型不匹配,需要改为c1=char(c1+4)

★ =: 赋值运算符,在编译器将右边的表达式结果计算出来后,和左边的变量类型比较精度,如果左边的变量精度低于右边的结果的精度,编译器会显式的报错,告诉程序员去强制转型。(所以s1 = s1 + 1出错)最后将表达式的结果复制到变量所在的内存区。

★ +=:暂且称之为**运算符,编译器自动隐式直接将+=运算符后面的操作数强制装换为前面变量的类型,然后在变量所在的内存区上直接根据右边的操作数修改左边变量内存存储的二进制数值(所以 s += 1不报错)最后达到和赋值运算符相同的目的。与前者相比,由于后者是位操作,效率也较前者高。

+= 直接自行转换了

+= Java内部做了处理,把后面的数值自动强制转换为前面的类型, char c1 = 'C' ; c1+=4 相当于是(c1=(char)c1+4);
= Java内部没有做处理, (非自动强制转换的普通赋值!),char c1 = 'C' ;所以c1=c1+4; 报错

+=底层给我们转换了,隐式转换

c1 += 4 的实质是: (char) c = (char)(c + 4);
c1 = c1 + 4的实质是:(char) c1 = (char) c1 + (int) 4;
而(char) c1 + (int) 4的结果是(int)类型的,int类型的数据不能用char来接收,所以报错

楼上说的都对。+=是java内部进行了运算处理,=是赋值,int类型和char类型不同就会报错。

加法运算即在计算+的时候,会自动将char类型(还可能是其他类型)转换为int类型,而int类型不能自动转化为char类型。所以需要强制转化一下。
这属于类型转化问题之中最常见的问题。

首先你要知道这是类型转化问题,其次你要知道各个基本类型的范围,最后你要知道,小范围可以隐式自动转化到大范围,反之则不可以。
希望对楼主有帮助。

每个基本数据类型都有范围,类型转换byte->short(char)->int->long->float->double.
“=”是赋值运算,要求两侧数据类型一致
“+”是自加运算,运算结果机器内部自动处理,提升一级数据类型

因为c1是char类型 ,char类型的范围大小比int类型小,所以会自动把c1转换成int类型与4相加后结果是一个int类型,因为你赋值的结果c1是char类型,大类型变成小类型需要进行强制转换,而+=运算符内部已经隐式包含了强制类型转换,所以不会报错

类型转换的问题,,+=自带转换属性