java中的pre和post增量是做什么用的(速记,在增量之前或之后获取值)?

时间:2018-08-21 20:14:01

标签: java operators

我知道前后递增(如++i, i++, --i, i--)用于速记,在递增之前或之后获取值。这也可以通过其他方法来实现。但是,他们还有其他优势吗?

1 个答案:

答案 0 :(得分:4)

那么,两者之间有什么区别?

  • x++
  • ++x
  • x += 1
  • x = x + 1

Louis Wasserman in a comment所述:

  

在JIT有机会处理代码之后,应该没有任何其他优势。他们将被编译成同一件事。

但是,仅当这4个用作独立的声明时,这才是正确的声明。它们中的全部4个也可以用作表达式,在这种情况下,它们并不完全相同:

  • a = x++是值之前递增x
  • a = ++xa = x += 1a = 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