有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java postincrement(++)在作为参数传递时表现不符合预期

我遇到了以下问题:

private void doStuff(int i) {
   if(i>10) {
      return;
   }
   doStuff(i++); 
}

public void publicMethod() {
   doStuff(i);
}

我希望它运行doStuff10次,然后返回

但是i++在用0再次调用doStuff之前不会执行

结果是一个无限循环。我知道如何修复它,但我想知道这种行为是正确的还是错误的


共 (4) 个答案

  1. # 1 楼答案

    它的行为与预期的相同,您可能希望用++i替换i++

    关于如何使用前缀/后缀一元增量运算符,请查看oracle documentation

    class PrePostDemo {
        public static void main(String[] args){
            int i = 3;
            i++;
            // prints 4
            System.out.println(i);
            ++i;               
            // prints 5
            System.out.println(i);
            // prints 6
            System.out.println(++i);
            // prints 6
            System.out.println(i++);
            // prints 7
            System.out.println(i);
        }
    }
    

    (摘自链接页面)

  2. # 2 楼答案

    ++操作符的工作原理与预期一样。它首先返回变量的值,然后增加变量,因此总是传递0

    这是:

    doStuff(i++);
    

    就像:

    int x = i;
    i += 1;
    doStuff(x);
    
  3. # 3 楼答案

    i++的意思是:“使用i的值,然后增加它”。当传递下去时,它将始终为零。它是一种值类型,而不是引用类型。如果那是一个对象,那就没问题了,因为它会被当作引用来处理

  4. # 4 楼答案

    Now I would expect this to run doStuff 10 times and then return, however i++ does not get execute before the doStuff is called again with 0.

    是的,后增量运算符的结果是原始值。。。然后在对该方法的下一次调用中,有一个新的i。换句话说,这个电话:

    doStuff(i++); 
    

    相当于:

    int original = i;
    i = original + 1;
    doStuff(original);
    

    JLS section 15.14.2

    The value of the postfix increment expression is the value of the variable before the new value is stored.

    既然你以后不再使用i(因此对它的任何副作用都是毫无意义的),为什么不简化你的生活呢

    doStuff(i + 1);
    

    (与Java中的所有参数一样,您会看到传递值——更改方法中i的值不会更改调用方参数的值。)