Java中的字符算法

在玩耍时我遇到了什么,这对我来说似乎很奇怪:

以下是无效的Java代码:

char x = 'A'; x = x + 1; //possible loss of precision 

因为其中一个操作数是整数,所以另一个操作数转换为整数。 结果无法分配给字符变量…而

 char x = 'A'; x += 1; 

是有效的,因为生成的整数 – 自动 – 转换为字符。

到现在为止还挺好。 这对我来说似乎很清楚但是……为什么以下是有效的Java代码?

 char x; x = 'A' + 1; 

因为

 'A' + 1 

是一个不变的表达。 在编译时已知结果将适合char

 'A' + 787282; 

将不适合char ,因此会导致编译错误。

它是有效的,因为它是一个编译时常量表达式。 如果是的话

 char x; char y = 'A'; x = y + 1; 

编译器会给你一个编译时错误,因为它现在不是编译时常量表达式。 但是如果你将变量y作为final ,表达式将再次转换为编译时常量,因此下面的代码将编译。

 char x; final char y = 'A'; x = y + 1; 

故事的道德是当你将一个整数赋给一个char时,编译器只要它是编译器时间常量就允许它,它应该适合char的范围。