Java中的整数算术与char和整数文字
有人可以向我解释为什么以下代码在Java中编译好吗?
char c = 'a' + 10;
为什么这不等于以下,不编译?
int i = 10; char c = 'a' + i;
Java语言规范(第3.10.1节)规定“如果整数文字的后缀为ASCII字母L或l(ell),则其长度为int
;否则为int
(§4.2.1)类型。” 第4.2.2节引用“数值运算符,它产生int
或long
类型的值”。 因此,在我的理解中,添加的结果应该是一个int
,它不能分配给char
变量c
。
但是,它编译得很好(至少在Sun JDK 1.6.0版本17和Eclipse Helios中)。
或许这是一个人为的例子,但它被用在我一直在教的Java入门课程中,现在我发现我并不真正理解为什么它有效。
'a' + 10
是一个编译时常量表达式 ,其值为'k'
,它可以初始化char
类型的变量。 这与能够在[-128,127]中为byte
变量分配byte
变量相同。 [128,255]范围内的byte
可能更烦人。
这是因为编译器可以检查它( 'a' + 10
)是否在char的范围内,而它(通常)不能检查'a' +
是否在边界内。
char实际上是一个无符号的16位整数,范围为0-65535。 因此,您可以将该范围内的任何整数文字分配给char,例如“char c = 96”,这会导致“c”保持字符“a”。 您可以使用System.out.println(c)打印出结果。
对于“char c =’a’+ 10”右侧的常量表达式,由于Java数字提升规则,’a’首先被提升为int,并且整数值为96.在向它添加10之后,我们得到一个文字整数106,可以分配给一个字符。
“char c =’a’+ i”的右侧不是常量表达式,表达式结果赋值规则需要从int到char的显式转换,即“char c =(char)(’a’ + i)“。
常量是不同的类型(我知道规范说10
应该是一个int,但编译器不会这样看)。
在char c = 'a' + 10
,10实际上被认为是char类型的常量变量(因此可以将其添加到a)。 因此char c = char + char
起作用。
在int i = 10; char c = 'a' + i;
int i = 10; char c = 'a' + i;
你正在为一个整数添加一个char(一个整数可以比一个char大得多,所以它选择更大的数据类型[ int
]为结果aka: 'a' + i = int + int
)。 所以加法的结果是一个整数,它不能适合char c
。
如果你明确地将i
变成了一个char(例如: char c = 'a' + (char)i;
)它可以工作,或者你做了相反的事情(例如: int c = (int)'a' + i;
)它会奏效。