Java后递增(++)在作为参数传递时不会按预期运行

时间:2012-10-12 13:24:57

标签: java post-increment pre-increment

我遇到了以下问题:

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

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

我希望这会运行doStuff 10次然后返回。

但是,在使用i++再次调用doStuff之前,0未执行。

结果是无限循环。我知道如何解决它,但我想知道这种行为是否正确或是一个错误。

4 个答案:

答案 0 :(得分:14)

  

现在我希望这会运行doStuff 10次然后返回,但是在使用0再次调用doStuff之前i ++没有执行。

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

doStuff(i++); 

相当于:

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

来自JLS section 15.14.2

  

后缀增量表达式的值是存储新值之前的变量的值。

鉴于你之后不再使用i(因此任何副作用都没有意义),为什么不简化你的生活呢?

doStuff(i + 1);

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

答案 1 :(得分:3)

它的行为应为预期,您可能希望将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 :(得分:1)

++运算符的工作方式与预期一致。它首先返回变量的值,然后增加变量,因此总是传递0。

此:

doStuff(i++);

就像:

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

答案 3 :(得分:1)

i++表示:“使用i的值然后递增它”。传递下来时总是为零。它是值类型,而不是引用类型。如果那是一个对象,那就不会有问题,因为它会被作为参考处理。