Java增量运算符查询(++ i和i ++)
这个问题在这里已经有了答案:
首先你需要知道x++
和++X
之间的区别;
在x++
情况下:
首先使用当前值,接下来会增加。 这意味着您将获得操作的x
的当前值,并且如果下一次使用x将获得增加的值;
在++x
情况下:
首先,当前值将递增,然后它将被用于(增加的值),这意味着您将在此操作中获取增加的值,并在此操作后获取增加的值。
现在我们分离代码并分别讨论它们
方法:sample1():
private static int sample1(int i) {
return i++;
}
这个方法将接受一个int并返回它,然后尝试增加,但是在返回变量后, i
将超出范围,所以它永远不会增加。 exp in: 10-> out 10
方法:sample2():
private static int sample2(int j) {
return ++j;
}
此方法将采用一个int并将其先递增并返回。 exp in: 10-> out 11
在这两种情况下,只有变量会在本地发生变化,这意味着如果您从main方法调用main方法的变量将保持不受变化影响(因为sample1()和sample2()正在复制变量)
现在是主要方法的代码
System.out.println(sample1(i++)); // it's giving sample1() `i=0` then making `i=1`
// so sample1() will return 0 too;
System.out.println(sample1(++i)); // it's making `i=2` and then giving sample1() `i=2`
// so sample1() will return 2;
System.out.println(sample2(j++)); // it's giving sample2() `j=0` then making `j=1`
// so sample2() will return 1;
System.out.println(sample2(++j)); // it's making `j=2` giving sample2() `j=2` then
// so sample2() will return 3;
由于sample1
和sample2
只是修改它们自己的局部变量i
和j
(不是调用方法的那些变量),所以如果我们在不进行这些修改的情况下重写它们就会更清楚:
private static int sample1(int i) {
return i; // was 'i++', which evaluates to the old i
}
private static int sample2(int j) {
return j + 1; // was '++j', which evaluates to j after incrementing
}
在这一点上,只需简单地将它们替换 - sample1(...)
变为...
, sample2(...)
变为... + 1
:
int i = 0;
int j = 0;
System.out.println(i++);
System.out.println(++i);
System.out.println((j++) + 1);
System.out.println((++j) + 1);
System.out.println(i);
System.out.println(j);
我们可以通过将增量分解为自己的命令来使这一点更清晰。 i++
计算结果为原始值i
,所以它像递增i
运行周边命令之后; ++i
相反,就像在运行周围命令之前递增i
一样。 所以我们得到:
int i = 0;
int j = 0;
System.out.println(i);
i++;
++i;
System.out.println(i);
System.out.println(j + 1);
j++;
++j;
System.out.println(j + 1);
System.out.println(i);
System.out.println(j);
。 。 。 在这一点上应该直截了当地追踪并看看它会输出什么。
这一切都有道理吗?
您正在体验前缀和后缀运算符的乐趣。
前缀运算符++i
在将变量i
用于表达式之前,将变量++i
递增1,其中后缀运算符( i++
)在增量表达式之前在表达式中使用i
。
这意味着你的方法sample1
不做任何事情; 它会评估包含i
的表达式,但因为该表达式是一个返回语句,所以局部变量i
超出范围,我们不能再修改它了。
相反, sample2
在返回j
之前递增j
的本地副本,这就是为什么您打印的j
值比预期更高。