我知道前后递增(如++i, i++, --i, i--
)用于速记,在递增之前或之后获取值。这也可以通过其他方法来实现。但是,他们还有其他优势吗?
答案 0 :(得分:4)
那么,两者之间有什么区别?
x++
++x
x += 1
x = x + 1
如Louis Wasserman in a comment所述:
在JIT有机会处理代码之后,应该没有任何其他优势。他们将被编译成同一件事。
但是,仅当这4个用作独立的声明时,这才是正确的声明。它们中的全部4个也可以用作表达式,在这种情况下,它们并不完全相同:
a = x++
是值之前递增x
。a = ++x
,a = x += 1
和a = x = x + 1
都是在 递增x
之后的值。此外,x = x + 1
评估x
两次,而其他3只评估一次。对于简单的x
来说,没有什么区别,但是对于数组查找a[k]
会有所作为,尤其是在“ k”可以更改的情况下。
示例:
// setup
int[] a = { 5, 15, 25 };
int k = 0;
// result of each if run right after setup
a[k++]++; // k = 1, a = [6, 15, 25]
++a[k++]; // k = 1, a = [6, 15, 25]
a[k++] += 1; // k = 1, a = [6, 15, 25]
a[++k]++; // k = 1, a = [5, 16, 25]
a[k+=1]++; // k = 1, a = [5, 16, 25]
a[k=k+1]++; // k = 1, a = [5, 16, 25]
a[k++] = a[k++] + 1; // k = 2, a = [16, 15, 25]
现在,最后一个是傻瓜。有关其工作原理的详细说明,请参见this answer,但它的计算从左到右:
k = 0; a[k++] = a[k++] + 1;
k = 1; a[0] = a[k++] + 1;
k = 2; a[0] = a[1] + 1;
k = 2; a[0] = 15 + 1;
k = 2; a[0] = 16;
回顾:
x
没有副作用(很常见)。x++
后递增计算得出的值是不同的。x = x + 1
评估x
两次,如果x
有副作用(稀有),这很重要。除此之外,使用哪个是一个选择问题。
字节码
对于那些对字节码感兴趣的人,使用Eclipse编译器,如果“ x”是一个简单变量,则所有4个as语句都将编译为
iinc 1, 1
作为具有简单变量的表达式,例如y = x++
,它们的编译方式不同:
// y = x++;
iload_2
iinc 2, 1
istore_1
// y = ++x; y = x += 1; y = x = x + 1;
iinc 2, 1
iload_2
istore_1
带有数组:
// y = a[k]++;
aload_1
iload_2
dup2
iaload
dup_x2
iconst_1
iadd
iastore
istore_3
// y = ++a[k]; y = a[k] += 1;
aload_1
iload_2
dup2
iaload
iconst_1
iadd
dup_x2
iastore
istore_3
// y = a[k] = a[k] + 1;
aload_1
iload_2
aload_1
iload_2
iaload
iconst_1
iadd
dup_x2
iastore
istore_3