一尘不染

Java - char, int conversions

java

在Java中,允许以下操作:

char c = 'A' + 1;

在这里,c将保持值“ B”。上面,首先对表达式求值。所以’A’被转换为65,整个表达式的计算结果为66,然后将66转换为’B’,因为我们将值存储在char中。

但是,以下给出了编译时错误:

char c = 'A';
c = c + 1;

关于Java如何以不同的方式看待表达式的解释是什么?顺便说一句,以下内容也可以正常工作:

char c = 'A';
c++;

阅读 463

收藏
2020-03-09

共1个答案

一尘不染

第一个示例(编译)很特殊,因为加法的两个操作数都是文字。

以下是一些定义:

  • 一个转换intchar被称为基本收缩转换,因为char是比较小的类型int
  • 'A' + 1是一个常量表达式。常量表达式(基本上)是一个表达式,其结果始终相同,并且可以在编译时确定。尤其是,'A' + 1是一个常量表达式,因为的操作数+都是文字。

的分配期间,缩小转换被允许byte,short并且char,如果分配的右手边是一个常量表达式:

此外,如果表达式[根据右手侧]是类型的常量表达式byteshortchar,或int

如果变量的类型为byte,short或char,并且常量表达式的值在变量的类型中可表示,则可以使用缩窄的原始转换。
c + 1是不是一个常量表达式,因为c是非final可变的,所以对于分配发生编译时间错误。通过查看代码,我们可以确定结果始终相同,但是在这种情况下,不允许编译器执行该操作。

我们可以做的一件有趣的事情是:

final char a = 'a';
char b = a + 1;

在那种情况下a + 1 是一个常量表达式,因为它是一个用常量表达式初始化a的final变量。

警告“如果[…]值[…]在变量的类型中是可表示的”,则意味着将不编译以下内容:

char c = 'A' + 99999;

'A' + 99999(其是100064,或0x186E0)太大,以适应于char,因为char是无符号16位整数。

至于后缀++运算符:

后缀增量表达式的类型是变量的类型。

在加法之前1,对变量的值和值执行二进制数值提升* 。如有必要,可通过将原始和变窄来对其进行变窄和/或在存储变量之前将其进行装箱转换为变量的类型。

(* 二元数字升级需要byteshort以及char运营商的操作数等+,并把它们转换成int或其他一些更大的类型。Java并不在整型小于做算术题int。)

换句话说,该语句c++;主要等同于:

c = (char)(c + 1);

(不同之处在于,如果将表达式的结果c++分配给某物,则该结果为增量c 之前的值。)

2020-03-09