【问题标题】:Why can't you add an int and a char in some cases?为什么在某些情况下不能添加 int 和 char?
【发布时间】:2014-08-27 19:07:17
【问题描述】:

为什么

char ch = '4';
ch = '4' + 2;

工作,但是

char ch = '4';
ch = ch  + 2;

没有?

【问题讨论】:

标签: java


【解决方案1】:

为了理解这一点,让我们考虑一下编译器在每个步骤中针对这两种可能性所做的工作。让我们开始:

ch = '4' + 2;

编译器将 '4' 转换为 int。于是就变成了

ch = 52 + 2;

然后编译器变成什么

ch = 54;

ch是char,允许编译器将54转换为char,因为这样可以证明转换没有损失。

现在让我们考虑第二个版本:

ch = ch  + 2;

ch 在编译时没有已知值。这样就变成了

ch = ((int) ch) + 2;

现在编译器不能证明这个(一个int)的结果可以存储在一个char的范围内。因此它不会自动缩小范围,并将其报告为错误。

编辑1:

如果编译器可以证明变量永远不会改变,并且是可内联的。然后可以将第二种形式变成第一种形式。 Subir 指出,添加“final”使这成为可能。虽然如果编译器要执行更改分析,那么它在技术上能够在没有 final 关键字的情况下解决这个问题,但 final 确实让编译器和代码的读者更容易。

编辑2:

Java Language Spec 涵盖了将 int 缩小为 char 的内容,该链接由 Jon Skeet 提供。

【讨论】:

  • 是的,主要区别在于编译时间和运行时间转换。
  • 支持答案:final char c = '4'; ch = c + 2; 也可以。
  • 您可能还想添加指向规范的链接。
  • @Tim,你肯定是说final char a = '4'; char b = a + 2; 可以工作,而char a = '4'; char b = a + 2; 不行。
  • @Lester 因为语言设计者将字符溢出视为明显的大小写缺陷;在这种情况下,他们可以在编译时检测到一个。请注意,整数并非如此。
猜你喜欢
  • 2019-12-18
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多