Java - char,int转换

Cos*_*ust 39 java int type-conversion char variable-assignment

在Java中,允许以下内容:

char c = 'A' + 1;
Run Code Online (Sandbox Code Playgroud)

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

但是,以下内容会产生编译时错误:

char c = 'A';
c = c + 1;
Run Code Online (Sandbox Code Playgroud)

Java如何以不同方式查看表达式的解释是什么?顺便说一句,以下工作也很好:

char c = 'A';
c++;
Run Code Online (Sandbox Code Playgroud)

Rad*_*def 38

第一个例子(编译)是特殊的,因为添加发生在变量的初始化器中,并且两个操作数都是文字.

一些定义开始:

  • 转换为intto char称为缩小基元转换,因为它char是比较小的类型int.

  • 'A' + 1是一个不变的表达.常量表达式(基本上)是一个表达式,其结果始终相同并且可以在编译时确定.特别是,'A' + 1是一个常量表达式,因为操作数+都是文字.

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

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

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

c + 1不是一个常量表达式,因为c是非final可变的,所以对于分配发生编译时间错误.从查看代码,我们可以确定结果总是相同的,但在这种情况下不允许编译器执行此操作.

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

final char a = 'a';
char b = a + 1;
Run Code Online (Sandbox Code Playgroud)

在这种情况下a + 1 一个常量表达式,因为它是一个用常量表达式初始化afinal变量.

警告"if [...]值[...]在变量类型中可表示"意味着以下内容无法编译:

char c = 'A' + 99999;
Run Code Online (Sandbox Code Playgroud)

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


至于后缀++运算符:

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

...

在添加之前1,对变量的值和值执行二进制数字提升*.如果需要,通过缩小基元转换来缩小总和和/或在存储变量之前将其转换为变量类型.

(*二元数字升级需要byte,short以及char运营商等的操作数+,并将其转换为int或其他一些更大的类型.Java并不做算术题的整型小于int.)

换句话说,该陈述c++;大致相当于:

c = (char)(c + 1);
Run Code Online (Sandbox Code Playgroud)

(不同之处在于表达式的结果c++,如果我们将其赋值给某个东西,则是增量c 之前的值.)

其他增量和减量具有非常相似的规格.

复合赋值运算符也可以+=自动执行缩小转换,因此也允许使用诸如c += 1(或偶数c += 3.14)之类的表达式.