当前位置: 首页 > 面试题库 >

在某些情况下,为什么不能添加int和char?

武琛
2023-03-14
问题内容

为什么

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

工作,但是

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

不是吗


问题答案:

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

ch = '4' + 2;

编译器将‘4’转换为int。所以变成

ch = 52 + 2;

然后编译器变成

ch = 54;

ch是一个字符,编译器可以将54转换为字符,因为它可以证明转换没有损失。

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

ch = ch  + 2;

ch在编译时没有已知值。因此,这成为

ch = ((int) ch) + 2;

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

编辑1:

如果编译器可以证明该变量永远不会改变,并且是可内联的。然后可以将第二种形式转换为第一种形式。Subir指出,添加“
final”可以实现这一点。尽管如果编译器要执行更改分析,那么从技术上讲,它无需使用final关键字就能解决此问题,但是final确实使编译器和代码阅读者更容易进行操作。

编辑2:

Java语言规范中涵盖了将int缩小为char的情况,该链接由Jon
Skeet提供。



 类似资料:
  • 问题内容: 今天,在浏览各种问题时,我遇到了一个问题,在我看来有点不可思议,为什么一个人要在上面加上a ,对于这种情况会不会有什么真正的原因,所以这只是微不足道的吗? 问题答案: 动画图像作为GUI的BG。我使用HTML来调整此尺寸(x3),但是如果它已经是所需的尺寸,则可以直接将其设置为标签的。 不知道它是否是“真正的”。这似乎是一个主观术语,需要更多说明。我从来没有使用过这种方法,只是想通了,

  • 我正在测试一些东西,遇到了一个奇怪的情况,当我有一个断点时,IntelliJ没有调试我的代码,如图1所示。但是当我移动断点时,工作正常。 代码: 当我在这里有我的调试点时(见图),这不起作用并给出以下错误: 错误: 连接到目标虚拟机,地址:“127.0.0.1:59776”,传输:“socket”OpenJDK 64位服务器虚拟机警告:共享仅支持引导加载程序类,因为已附加引导类路径,与目标虚拟机断

  • 问题内容: 我使用 CMake* (3.4.1)根据 Boost 库构建一个C ++项目。宿主平台是 Linux ,目标是宿主和 交叉构建 Android NDK。 * 我只使用Boost头文件,而我只是下载/提取了boost文件夹(并且我没有目录)。 在我的文件中,我这样声明对Boost的依赖关系: 我将构建配置如下: 这实际上 可以 像我的 本机 版本一样工作。 现在,当我以完全相同的方式(仅

  • 我目前正在承担一个项目,我正在使用Java微基准线束(JMH)框架测量Java中不同类型循环的速度。我得到了一些关于流的有趣结果,我无法解释,并且想知道是否更了解流和数组列表的人可以帮助我解释我的结果。 基本上,当遍历大小为100的数组列表时,stream.forEach方法比任何其他类型的循环都快得多: 我的结果图表显示在这里:https://i.imgur.com/ypXoWWq.png 我尝

  • 问题内容: 我希望下面的代码在上引发编译时错误,因为未声明为throw ,但编译成功(在Java 1.7.0_45中),并且如果编译时错误为,则会生成您期望的输出固定。 如果更改为,它也会编译。 不会按预期方式编译: 这样编译: 这不是: 这也可以编译: 一个更复杂的示例-被检查的异常由外部catch块捕获,而不是被声明为抛出。这样编译: 因此,当编译器可以确定捕获的异常始终合法地重新抛出时,似乎

  • 我遇到了一个非常奇怪的问题,java线程正忙着等待。 我有一个线程忙于等待其他线程的静态变量的状态。假设忙碌等待的线程正在等待另一个线程的静态int变量达到某个值 如果我使用上面的代码,线程将被卡在忙等待中,不会跳出while循环,即使确实达到5。 但是,如果我使用其他代码,那么线程确实会跳出忙等待循环。有时,一旦达到5,其他时候会晚一点。但它会发生。对于我的特定示例,我将其用作“无意义的工作”