我遇到了以下问题:
private void doStuff(int i) {
if(i>10) {
return;
}
doStuff(i++);
}
public void publicMethod() {
doStuff(i);
}
我希望这会运行doStuff
10次然后返回。
但是,在使用i++
再次调用doStuff
之前,0
未执行。
结果是无限循环。我知道如何解决它,但我想知道这种行为是否正确或是一个错误。
答案 0 :(得分:14)
现在我希望这会运行doStuff 10次然后返回,但是在使用0再次调用doStuff之前i ++没有执行。
是的,后增量运算符的结果是原始值...然后在下一次调用该方法时你有一个新的i
。换句话说,这个电话:
doStuff(i++);
相当于:
int original = i;
i = original + 1;
doStuff(original);
后缀增量表达式的值是存储新值之前的变量的值。
鉴于你之后不再使用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的值然后递增它”。传递下来时总是为零。它是值类型,而不是引用类型。如果那是一个对象,那就不会有问题,因为它会被作为参考处理。