7

我遇到了以下问题:

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

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

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

但是,在再次调用i++之前不会执行。doStuff0

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

4

4 回答 4

22

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

是的,后增量运算符的结果是原始值……然后在下一次调用该方法时,您将获得一个新的i. 换句话说,这个调用:

doStuff(i++); 

相当于:

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

JLS 第 15.14.2 节

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

鉴于您i以后不再使用(因此任何副作用都是毫无意义的),为什么不简化您的生活呢?

doStuff(i + 1);

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

于 2012-10-12T13:26:46.000 回答
3

它的行为符合预期,您可能想要替换i++++i.

查看有关如何使用前缀/后缀一元增量运算符的oracle 文档:

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);
    }
}

(摘自链接页面)

于 2012-10-12T13:26:49.983 回答
2

++操作员按预期工作。它首先返回变量的值,然后增加变量,因此您始终传递 0。

这:

doStuff(i++);

就好像:

int x = i;
i += 1;
doStuff(x);
于 2012-10-12T13:26:24.423 回答
1

i++意思是:“使用 i 的值,然后增加它”。传递时它总是为零。它是值类型,而不是引用类型。如果那将是一个对象,那将没有问题,因为它将作为参考处理。

于 2012-10-12T13:26:44.807 回答