Java增量运算符查询(++ i和i ++)

mis*_*ded 7 java increment

我有以下代码:

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

由于sample1sample2只是修改自己的局部变量ij(不是那些调用的方法),它更清晰,如果我们重写它们没有这些修改:

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)


Jas*_*ker 8

您正在体验前缀和后缀运算符的乐趣.

前缀运算符在表达式中使用它之前++i将变量递增i1 ,后缀运算符()在递增之前使用表达式.i++i

这意味着你的方法sample1没有做任何事情; 它计算包含的表达式i,但因为该表达式是一个return语句,所以局部变量i超出了范围,我们不能再修改它了.

sample2相反,j在返回之前递增本地副本,这就是为什么要打印j比预期更高的值.