我遇到了以下问题:
private void doStuff(int i) {
if(i>10) {
return;
}
doStuff(i++);
}
public void publicMethod() {
doStuff(i);
}
我希望这会运行doStuff
10 次然后返回。
但是,在再次调用i++
之前不会执行。doStuff
0
结果是一个无限循环。我知道如何解决它,但我想知道这种行为是正确的还是错误的。
我遇到了以下问题:
private void doStuff(int i) {
if(i>10) {
return;
}
doStuff(i++);
}
public void publicMethod() {
doStuff(i);
}
我希望这会运行doStuff
10 次然后返回。
但是,在再次调用i++
之前不会执行。doStuff
0
结果是一个无限循环。我知道如何解决它,但我想知道这种行为是正确的还是错误的。
现在我希望它运行 doStuff 10 次然后返回,但是在使用 0 再次调用 doStuff 之前 i++ 不会执行。
是的,后增量运算符的结果是原始值……然后在下一次调用该方法时,您将获得一个新的i
. 换句话说,这个调用:
doStuff(i++);
相当于:
int original = i;
i = original + 1;
doStuff(original);
后缀增量表达式的值是存储新值之前变量的值。
鉴于您i
以后不再使用(因此任何副作用都是毫无意义的),为什么不简化您的生活呢?
doStuff(i + 1);
(与Java 中的所有参数一样,您会看到按值传递 - 更改i
方法中的值不会更改调用者参数的值。)
它的行为符合预期,您可能想要替换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);
}
}
(摘自链接页面)
++
操作员按预期工作。它首先返回变量的值,然后增加变量,因此您始终传递 0。
这:
doStuff(i++);
就好像:
int x = i;
i += 1;
doStuff(x);
i++
意思是:“使用 i 的值,然后增加它”。传递时它总是为零。它是值类型,而不是引用类型。如果那将是一个对象,那将没有问题,因为它将作为参考处理。