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

为什么字节+ = 1编译但字节=字节+ 1不编译?

易和怡
2023-03-14
问题内容

如果我有一个字节变量: byte b = 0;

为什么以下工作:

   b++;
   b += 1; // compiles

…但这不是吗?

   b = b + 1; // compile error

编译器第一理解为byte第二int吗?

[编辑]

我知道演员,但我想提请您注意 b++, b += 1 and b = b + 1

我认为它们是平等的,那么为什么编译器会有所不同呢?之间有什么区别

  b += 1 and b = b + 1 ?

问题答案:

因为b += 1是的等效项b = (byte)(b + 1),而的类型b + 1被提升为int(JLS§5.6.2二进制数值提升),因此,byte如果不进行显式转换,则不能将其结果分配给它。

根据JLS,§15.26.2复合赋值运算符

形式为E1 op = E2的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,只是E1仅被评估一次。



 类似资料:
  • 问题内容: 为什么可以,但不能编译? 问题答案: 常量被评估为int,因此会溢出并为您提供一个新的int,该int可分配给,同时也被评估为equals ,而不能分配给。

  • 问题内容: 我遇到了一些有关JVM / JIT活动的参考,其中似乎在编译字节码和解释字节码之间有区别。该特定注释声明的字节码在前10000次运行时进行解释,然后进行编译。 “编译”和“解释”字节码之间有什么区别? 问题答案: 解释字节码基本上是逐行读取字节码,不进行任何优化或任何操作,然后对其进行解析并实时执行。由于许多原因,这种方法效率低下,其中包括Java字节码设计得不能快速解释的问题。 编译

  • 导航 目录 上一章:Lua 与 C/C++ 交互 下一章:LuaJIT 介绍

  • 问题内容: 我的编译器类正在创建一种我们打算编译为Java字节码的语言。我们已经取得了很大的进步,并且正在接近代码生成的时间。 我们在查找有关如何从编译器创建.class文件的信息时遇到问题。您有什么资源可以为我们提供帮助吗?我们已经有很多关于指令集的文档,但是需要有关如何直接填写类文件/十六进制编写的信息。 我们不需要有关反编译.class文件的信息或建议。 即使是从头开始编写.class文件的

  • Compiling One Directory # compileall_compile_dir.py import compileall import glob def show(title): print(title) for filename in glob.glob('examples/**', recursi