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 = ++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]
现在,最后一个真是太棒了。有关其工作原理的详细解释,请参阅 ,但它从左到右求值:
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
我知道 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 = ++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]
现在,最后一个真是太棒了。有关其工作原理的详细解释,请参阅
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