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
第一个例子(编译)是特殊的,因为添加发生在变量的初始化器中,并且两个操作数都是文字.
一些定义开始:
转换为int
to char
称为缩小基元转换,因为它char
是比较小的类型int
.
'A' + 1
是一个不变的表达.常量表达式(基本上)是一个表达式,其结果始终相同并且可以在编译时确定.特别是,'A' + 1
是一个常量表达式,因为操作数+
都是文字.
的分配期间,缩小转换被允许byte
,short
并且char
,如果分配的右手边是一个常量表达式:
此外,如果表达式[根据右手侧]是类型的常量表达式
byte
,short
,char
,或int
:
- 如果变量是type
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.
c + 1
是不是一个常量表达式,因为c
是非final
可变的,所以对于分配发生编译时间错误.从查看代码,我们可以确定结果总是相同的,但在这种情况下不允许编译器执行此操作.
我们可以做的一件有趣的事情是:
final char a = 'a';
char b = a + 1;
Run Code Online (Sandbox Code Playgroud)
在这种情况下a + 1
是一个常量表达式,因为它是一个用常量表达式初始化a
的final
变量.
警告"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
)之类的表达式.
归档时间: |
|
查看次数: |
19199 次 |
最近记录: |