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值比预期更高。
