java分析各种增量运算符与赋值和增量运算符
不久前有人问Is the ++ operator more efficient than a=a+1?。我想我之前分析过这一点,最初说a = a + 1
和增量运算符++
之间没有区别。事实证明,a++
、++a
和a += 1
都编译成相同的字节码,但a = a + 1
确实而不是,如下所示:
public class SO_Test
{
public static void main(String[] args)
{
int a = 1;
a++;
a += 1;
++a;
}
}
输出:
例如:
public class SO_Test
{
public static void main(String[] args)
{
int a = 1;
a = a + 1;
a++;
a += 1;
++a;
}
}
输出:
简而言之,a = a + 1
发布iload_1
、iconst_1
、iadd
和istore_1
,而其他的只使用iinc
我试着让这合理化,但我做不到。在这种情况下,编译器的智能是否足以优化字节码?这些不同有什么好的理由吗?这是由JIT处理的吗?除非我的理解有误,否则我似乎永远不应该使用a = a + 1
,我确信这只是一种文体选择
# 1 楼答案
值得注意的是,这是特定于编译器的。我发现至少有一个eclipse版本以与
x++
相同的方式编译x=x+1
。此外,这只与局部变量有关,因为字段没有类似的字节码指令。它只适用于int
类型的变量。因此字节码的影响相当有限。这很可能改善了常见的for(int i=start; i<limit; i++)
模式。在语言方面,尤其是对a[b()] ++
和a[b()] = a[b()] + 1
等而言,它产生了影响