例如,如果我在Eclipse中用Java编译它
intvar = (int)(((var1 * var3))*(7));
编译器会将其清理为
intvar = (int) var1 * var3 * 7;
然后编译器会做它的机器代码和东西。
或者我是否必须对编译器做一些特殊的操作以使其优化代码?
此外,这是否适用于所有其他已编译的语言?
答案 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)
括号实际上并不生成代码。它们不是操作。括号只是控制输出代码的顺序,或者更确切地说,控制执行操作的顺序。所以不,你不需要担心“不必要的”括号,除了顺序影响结果的情况(例如,由于你的方式,操作突然以浮点而不是整数执行)。