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

这个问题在这里已经有了答案:

  • Java是“通过引用传递”还是“按值传递”? 78个答案
  • Java从来没有通过引用,对吧?......对吧? [复制] 6个回答

  • 首先你需要知道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;
    

    由于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
    }
    

    在这一点上,只需简单地将它们替换 - 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值比预期更高。

    链接地址: http://www.djcxy.com/p/3509.html

    上一篇: Java Incremental operator query (++i and i++)

    下一篇: Does Java pass by reference?