编译器是否删除了不必要的括号

时间:2014-03-23 21:54:06

标签: java compiler-construction

例如,如果我在Eclipse中用Java编译它

intvar = (int)(((var1 * var3))*(7));

编译器会将其清理为

intvar = (int) var1 * var3 * 7;

然后编译器会做它的机器代码和东西。

或者我是否必须对编译器做一些特殊的操作以使其优化代码?

此外,这是否适用于所有其他已编译的语言?

4 个答案:

答案 0 :(得分:5)

编译器将java代码转换为字节代码。字节代码根本没有括号。它适用于堆栈。

答案 1 :(得分:5)

使用javap -c检查字节码:

intvar = (int)(((var1 * var3))*(7));

变为:

   4: iload_1       
   5: iload_2       
   6: imul          
   7: bipush        7
   9: imul          
  10: istore_3      

intvar = (int) var1 * var3 * 7;

变为:

   4: iload_1       
   5: iload_2       
   6: imul          
   7: bipush        7
   9: imul          
  10: istore_3      

即。完全相同。

答案 2 :(得分:2)

编译器删除所有括号。如果所有操作数都是整数,那么从JLS和编译器的角度来看,你的两个语句是相同的。

但是如果你写了

intvar = (int)((var1*(var2*7)))

所需的执行顺序是不同的,因此您将获得不同的字节码。

答案 3 :(得分:2)

括号实际上并不生成代码。它们不是操作。括号只是控制输出代码的顺序,或者更确切地说,控制执行操作的顺序。所以不,你不需要担心“不必要的”括号,除了顺序影响结果的情况(例如,由于你的方式,操作突然以浮点而不是整数执行)。