在Java中,允许以下操作:
char c = 'A' + 1;
在这里,c将保持值“ B”。上面,首先对表达式求值。所以’A’被转换为65,整个表达式的计算结果为66,然后将66转换为’B’,因为我们将值存储在char中。
但是,以下给出了编译时错误:
char c = 'A'; c = c + 1;
关于Java如何以不同的方式看待表达式的解释是什么?顺便说一句,以下内容也可以正常工作:
char c = 'A'; c++;
第一个示例(编译)很特殊,因为加法的两个操作数都是文字。
以下是一些定义:
int
char
'A' + 1
的分配期间,缩小转换被允许byte,short并且char,如果分配的右手边是一个常量表达式:
此外,如果表达式[根据右手侧]是类型的常量表达式byte,short,char,或int:
byte
short
如果变量的类型为byte,short或char,并且常量表达式的值在变量的类型中可表示,则可以使用缩窄的原始转换。 c + 1是不是一个常量表达式,因为c是非final可变的,所以对于分配发生编译时间错误。通过查看代码,我们可以确定结果始终相同,但是在这种情况下,不允许编译器执行该操作。
我们可以做的一件有趣的事情是:
final char a = 'a'; char b = a + 1;
在那种情况下a + 1 是一个常量表达式,因为它是一个用常量表达式初始化a的final变量。
a + 1
警告“如果[…]值[…]在变量的类型中是可表示的”,则意味着将不编译以下内容:
char c = 'A' + 99999;
值'A' + 99999(其是100064,或0x186E0)太大,以适应于char,因为char是无符号16位整数。
'A' + 99999
100064
0x186E0
至于后缀++运算符:
++
后缀增量表达式的类型是变量的类型。
…
在加法之前1,对变量的值和值执行二进制数值提升* 。如有必要,可通过将原始和变窄来对其进行变窄和/或在存储变量之前将其进行装箱转换为变量的类型。
(* 二元数字升级需要byte,short以及char运营商的操作数等+,并把它们转换成int或其他一些更大的类型。Java并不在整型小于做算术题int。)
换句话说,该语句c++;主要等同于:
c++
c = (char)(c + 1);
(不同之处在于,如果将表达式的结果c++分配给某物,则该结果为增量c 之前的值。)