为什么
char ch = '4';
ch = '4' + 2;
Run Code Online (Sandbox Code Playgroud)
工作,但是
char ch = '4';
ch = ch + 2;
Run Code Online (Sandbox Code Playgroud)
不?
Chr*_*s K 62
为了理解这一点,让我们考虑编译器在两个可能性的每个步骤中所做的事情.让我们开始:
ch = '4' + 2;
Run Code Online (Sandbox Code Playgroud)
编译器将'4'转换为int.所以它变成了
ch = 52 + 2;
Run Code Online (Sandbox Code Playgroud)
然后编译器变成了什么
ch = 54;
Run Code Online (Sandbox Code Playgroud)
ch是一个char,允许编译器将54转换为char,因为它可以证明转换没有丢失.
现在让我们考虑第二个版本:
ch = ch + 2;
Run Code Online (Sandbox Code Playgroud)
ch在编译时没有已知值.这就变成了
ch = ((int) ch) + 2;
Run Code Online (Sandbox Code Playgroud)
现在编译器无法证明这个(int)的结果可以存储在char的范围内.所以它不会自动缩小它,并将其报告为错误.
EDIT1:
如果编译器可以证明变量永远不会改变,并且是可内联的.然后第二种形式可以变成第一种形式.Subir指出,添加'final'使这成为可能.虽然如果编译器要执行更改分析,那么它在技术上能够在没有final关键字的情况下解决这个问题,但是final确实使编译器和代码的读者更容易.
EDIT2:
Java语言规范中涵盖了将int缩小为char ,该链接由Jon Skeet友情提供.
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |