java 中的 pre 和 post 增量用于除了(shorthand,在增量之前或增量之后获取值)?

what pre and post increment in java is used for except for (shorthand,getting value before increment or after increment)?

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

那么,它们之间有什么区别:

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

所述:

There shouldn't be any other advantage after the JIT has the chance to work over the code. They'll get compiled down to the same thing.

然而,如果这 4 个被用作独立的 陈述 ,则这只是一个正确的陈述。它们中的所有 4 个也可以用作 表达式 ,在这种情况下它们并不完全相同:

  • a = x++before 递增 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]

现在,最后一个真是太棒了。有关其工作原理的详细解释,请参阅 ,但它从左到右求值:

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++ post 增量计算为不同的值。
  • 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