Java中的整数算术与char和整数文字

Ben*_*Ben 18 java

有人可以向我解释为什么以下代码在Java中编译好吗?

char c = 'a' + 10;
Run Code Online (Sandbox Code Playgroud)

为什么这不等于以下,不编译?

int i = 10;
char c = 'a' + i;
Run Code Online (Sandbox Code Playgroud)

Java语言规范(第3.10.1节)规定"如果整数文字long后缀为ASCII字母L或l(ell),则为整数文字;否则为类型int(§4.2.1)." 第4.2.2节引用"数值运算符,它产生类型int或值的值long".因此,在我的理解中,添加的结果应该是一个int,不能分配给char变量c.

但是,它编译得很好(至少在Sun JDK 1.6.0版本17和Eclipse Helios中).

也许是一个人为的例子,但是它被用在我一直在教的Java入门课程中,现在我发现我并不真正理解为什么它有效.

ein*_*nus 16

这是因为编译器可以检查it('a' + 10)是否在char的边界内,而它(通常)不能检查'a' + <an integer>是否在边界内.


Tom*_*ine 10

'a' + 10是一个编译时常量表达式,其值为'k',可以初始化类型的变量char.这与能够byte在[-128,127]中分配带有文字整数的变量相同.byte在[128,255]范围内的A 可能更令人讨厌.