Java - char, int conversions
在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
被称为基本收缩转换,因为char
是比较小的类型int
。 'A' + 1
是一个常量表达式。常量表达式(基本上)是一个表达式,其结果始终相同,并且可以在编译时确定。尤其是,'A' + 1
是一个常量表达式,因为的操作数+都是文字。
的分配期间,缩小转换被允许byte,short并且char,如果分配的右手边是一个常量表达式:
此外,如果表达式[根据右手侧]是类型的常量表达式byte
,short
,char
,或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,对变量的值和值执行二进制数值提升* 。如有必要,可通过将原始和变窄来对其进行变窄和/或在存储变量之前将其进行装箱转换为变量的类型。
(* 二元数字升级需要byte
,short
以及char
运营商的操作数等+,并把它们转换成int
或其他一些更大的类型。Java并不在整型小于做算术题int。)
换句话说,该语句c++
;主要等同于:
c = (char)(c + 1);
(不同之处在于,如果将表达式的结果c++分配给某物,则该结果为增量c 之前的值。)
以上是 Java - char, int conversions 的全部内容, 来源链接: utcz.com/qa/413326.html