我有以下代码:
public class Book {
private static int sample1(int i) {
return i++;
}
private static int sample2(int j) {
return ++j;
}
public static void main(String[] arguments){
int i = 0;
int j = 0;
System.out.println(sample1(i++)); //0
System.out.println(sample1(++i)); //1
System.out.println(sample2(j++));//1
System.out.println(sample2(++j));//2
System.out.println(i);//2
System.out.println(j);//2
}
}
Run Code Online (Sandbox Code Playgroud)
我的预期输出在评论中.实际输出如下:
0
2
1
3
2
2
Run Code Online (Sandbox Code Playgroud)
我对函数调用和incemental运算符感到困惑.有人可以解释实际结果吗?
rua*_*akh 15
由于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
}
Run Code Online (Sandbox Code Playgroud)
在这一点上直接替换它们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);
Run Code Online (Sandbox Code Playgroud)
我们可以通过将增量分成它们自己的命令来使这一点更清楚.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);
Run Code Online (Sandbox Code Playgroud)
...在这一点上,它应该直截了当地查看它将输出什么.
这一切都有意义吗?
Sai*_*aif 12
首先你需要知道的区别x++
和++X
;
在以下情况下x++
:
首先,将使用当前值,然后它将递增.这意味着您将获得操作的当前值,x
如果您下次使用x将获得递增的值;
在以下情况下++x
:
首先,当前值将递增,然后将使用它(递增值),这意味着您将在此操作中获得递增的值,而在此操作之后将获得其他值.
现在让我们分开代码并分别讨论它们
方法:sample1():
private static int sample1(int i) {
return i++;
}
Run Code Online (Sandbox Code Playgroud)
这个方法将接受一个int并首先返回它,然后尝试递增,但是在返回之后,变量i
将超出范围,因此它永远不会递增.exp in: 10-> out 10
方法:sample2():
private static int sample2(int j) {
return ++j;
}
Run Code Online (Sandbox Code Playgroud)
此方法将获取一个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;
Run Code Online (Sandbox Code Playgroud)
您正在体验前缀和后缀运算符的乐趣.
前缀运算符在表达式中使用它之前++i
将变量递增i
1 ,后缀运算符()在递增之前使用表达式.i++
i
这意味着你的方法sample1
没有做任何事情; 它计算包含的表达式i
,但因为该表达式是一个return语句,所以局部变量i
超出了范围,我们不能再修改它了.
sample2
相反,j
在返回之前递增本地副本,这就是为什么要打印j
比预期更高的值.
归档时间: |
|
查看次数: |
5160 次 |
最近记录: |