我正在学习Java。我发现表达式通常必须转换为某种类型才能正确执行。例如,在算术计算期间,字节被提升为整数,因此以下表达式将引发错误:
byte b = 10;
int i;
i = b*b; //ok, assigning an integer evaluation to an integer variable
b = b*b; // throws error, coz assigning integer evaluation to byte variable
现在,我知道将整数分配给字符变量是可以的:char a; a = 88;
没关系。但是,如果我这样做:
char c2 = 'b', c3 = 'c';
c2 = c2 + c3; //throws error
c2 = (char)(c2 + c3); //works fine
为什么不强制转换时会抛出错误?毕竟,右侧仍然是整数,因此将整数分配给字符变量应该可以正常工作。
In c2 + c3
,两个操作数都隐式扩展为int
,所以相加的结果也是int
.
JLS §15.18.2。数字类型的加法运算符(+ 和 -) http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.2:
对操作数执行二进制数字提升(第 5.6.2 节)。
JLS §5.6.2。二进制数字提升 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2:
当运算符将二进制数字提升应用于一对操作数时(每个操作数必须表示可转换为数字类型的值),将按顺序应用以下规则:
加宽原语转换(第 5.1.2 节)适用于按照以下规则指定转换一个或两个操作数:
-
如果其中一个操作数的类型为 double,则另一个操作数将转换为 double。
-
否则,如果任一操作数的类型为 float,则另一个操作数将转换为 float。
-
否则,如果任一操作数的类型为 long,则另一个将转换为 long。
-
否则,两个操作数都转换为 int 类型。
因此你最终会得到一个int
。将其分配给char
变量需要显式转换。
You say:
由于整数值可以分配给字符变量......
Only constant整数表达式可以分配给char
没有强制转换的变量。
JLS §5.2。分配转换 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2:
此外,如果表达式是 byte、short、char 或 int 类型的常量表达式(第 15.28 节):
- 如果变量的类型是 byte、short 或 char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小基元转换。
这种自动缩小转换在这里不适用。你需要一个明确的演员表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)