java里不是说char类型自动向int型转换吗?那为什么..

char b='a'+18;
右边'a'是char类型 18是int类型 那两个操作数运算 结果应该是int类型。

但是左边又是char类型 比 右边等级低 所以右边应该强制类型转换

可是char b='a'+18; 语句不会报错,说明没问题,所以我搞不明怎么回事了

你首先要明白,在基本类型数据当中,强制类型转换只发生在int、long、float和double之间。比int类型低或就是int型的像byte型、short型、char型、int型之间的转换不不要强制类型转换,也不存在着运算优先级和类型转换的问题,这是java官方规定的,你无权修改。至于运算后的结果是否能够被左边的类型容纳,你在输入的时候就能知道。追问

什么意思,那你怎么知道18具体是什么类型的 你能确定18不是int类型吗?

那如果这样呢,请看题
char a='a';
char b=a+18; //运行时程序报错了,这里最后的结果是int,需要强制转换,为什么呢

追答

其实char a和'a'不是一回事。就像'a'+18 和b+18不是一回事一样。'a'这个东西是一个常量值(你不要看到'a'就以为它是char类型,其实这里写'a'和97是一样的,默认都是int类型的常量,仅仅加上单引号是为了告诉我们这里面只能放char规定范围的数值)。而你定义了char a='a'这就不一样了,这个a是变量,仅仅是把常量的值赋给变量,这个是'a'这个int值传递给了char,这时候a就是char类型了。char类型与18进行运算,当然得到的结果就是int型,而且必须是int型的内存块。
‘a’+18其实是两个int型的常量进行运算,然后生成一个新的int类型的常量。传递给b的是一个常量值(常量不可改变,变量可以改变),常量的值赋给变量,不存在强制转换,只要这个变量的类型值能够容纳这个新的常量即可。理解这个,你就需要理解常量不可改变这一点上,两个新的常量相加会生成一个新的常量。而变量与常量相加会形成一个新的变量值。
而a+18,其实a已经分配了一个内存空间用存放char类型变量a(记着,a是变量,值可以改变,常量值不可以改变,而且a是char类型),然后把a复制一份放到内存,然后用复制的值的与int类型的常量18进行运算,这时候生成是一个变量值(没有标注,但是一定有一个变量来存放它),然后把这个变量值赋给变量b,因为是变量,存在着类型转换问题。原理是因为a与18分别处于不同的内存块当中,这时候传递给b的是2个内存空间的值,这时候就存在着转换问题了。
其实,你只要理解了常量和变量的内存模型,这个问题就理解了。

至于具体的解释,可以看看马士兵老师的java基础教程,这里面对这种转换又十分合理的解释。
我的解释不站在内存分配上是很难解释的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-09
char b = 'a'+18; //因为char本身在码表中可以用数字表示的,然后运算玩之后还是char,应该输出s 
//另外,如果下面定义就是错的了。
char a = 'a';
char b = a + 18; // 这样就是错的,因为JVM运算完后不知道结果是多少,所以会提示损失精度的错误,关于一个类型变量值的问题。

本回答被网友采纳
第2个回答  2013-05-09
应该跟运算符优先级没有关系,
char b = 'a' + 18;的执行顺序应该是这样:
'a'+18先将'a'转成int类型的,即变成了97+18,
最后再隐式转换(char)(97+18),即获取结果为's'追问

97+18如果都已经是int类型了 在转成char 应该是强制转换, 怎么能是自动转换 没搞错吧- -

追答

char在Java中是16位的,因为Java用的是Unicode,所以char就有以下的初始化方式:
char c='c'; //字符,可以是汉字,因为是Unicode编码
char c=十进制数,八进制数,十六进制数等等; //可以用整数赋值
char c='\u四位十六进制数';
//用字符的编码值来初始化,如:char='\0',表示结束符,它的ascll码是0,这句话的意思和 char c=0 是一个意思。

嗯,上面说的是有一点问题,应该说,char这个数据类型比较特殊,是16位,占两个字符,用以\u开头的4位于十六进制数来表示,范围'\u0000'到'\uFFFF',而java中用的是十进制,也就是说,每个char字符都有其对应的十六制,当然也对应的65536个十进制的数字,'a'+18就在那65536个字符编码中先找到映射的'a'字符,再从'a'字符的映射位置向后移动18,也就是字符统一码中'a'后边第18字符

追问

char a='a';
char b=a+18;//程序报错,需要强制转换,为什么这里就不是字符结果,而是int

那这个怎么解释,跟'a'+18又有什么不同

追答

终于理解了!理一理头绪
1.char b = 'a' + 18;
2.char a = 'a';
char b = a + 18;

第1个不出错的原因是:char在java中底层是用short类型来表示的,范围0-65535,每个这个范围的数字应该被映射成了char中对应的字符( 也就是说,char和short之间可以相互在short和char之间转换),理解了这些后,再看'a'+18,这句中的18会缩窄类型,即18会向下转成short,则为'a'+(short)18,而short和char之间可以随意转换,前面b又是char类型的,所以完全可以容纳后面的计算后的类型;

第2个出错的原因:把'a'保存到变量a之中后,a 为char类型,a+18中将会拓宽类型,即会将a向上转成int类型,而计算的结果为int类型,则无法保存到类型为char的b中了,将会报“类型不匹配:不能从 int 转换为 char”的错误!

希望我这次讲清楚了。到现在我连数据类型都犯迷糊,惭愧。

本回答被提问者采纳
第3个回答  2013-05-09
这个不是这样理解的,等号两边存在等级关系,但是是不能比较的,等号左边b的类型是你在前面已经声明了的是不能变的,18是int类型,但是它表示的是unicode表中字符a往后的第18个位置所表示的字符,如果你在前面声明的b是int类型,那么等号左边就是int类型,如果右边不变,a就是97追问

char b=6+'a';

难道就是说字符a往前的第6个位置表示的字符?哦。说错了,其实要是加法都是往后的意思,那减法才是往前的意思?

相似回答