在Java中转换字符

Sex*_*ast 6 java

我正在学习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
Run Code Online (Sandbox Code Playgroud)

现在,我知道为字符变量分配一个整数是正确的:char a; a = 88;没关系.但是,如果我这样做:

char c2 = 'b', c3 = 'c';
c2 = c2 + c3; //throws error
c2 = (char)(c2 + c3); //works fine
Run Code Online (Sandbox Code Playgroud)

为什么它在没有铸造时会抛出错误?毕竟,右侧仍然是一个整数,因此为字符变量赋一个整数应该可以正常工作.

NPE*_*NPE 6

c2 + c3,两个操作数都被隐式加宽int,因此加法的结果也是一个int.

JLS§15.18.2.数值类型的加法运算符(+和 - ):

对操作数执行二进制数字提升(第5.6.2节).

JLS§5.6.2.二进制数字促销:

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用,顺序如下:

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

  • 如果任一操作数的类型为double,则另一个操作数转换为double.

  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float.

  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long.

  • 否则,两个操作数都将转换为int类型.

因此,你最终得到了一个int.将其分配给char变量需要显式强制转换.

你说:

由于整数值可以赋值给一个字符变量......

只有常量整数表达式可以在没有强制转换的char情况下分配给变量.

JLS§5.2.作业转换:

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.

此自动缩小转换不适用于此处.你需要一个明确的演员.