我写了一个方法来计算父亲是儿子两倍年龄时的时间,以及从现在开始多少年后这个条件仍然成立。但是,当父亲8岁,儿子3岁时,它返回“2年前”,而当父亲3岁,儿子2岁时,它返回“1年后”。我不关心如何改进代码,因为我已经知道如何做到这一点。相反,我困惑的是为什么for循环计数器在应该递增时出现递减的情况。
以下是我的代码。
通过twiceAsOld(8, 3)函数的调用,for循环的增量似乎已经反转,从0开始递减而不是递增。在twiceAsOld(3, 2)函数中,-1可能表示一个错误,表明父亲从未是儿子的两倍年龄,也永远不会是。我不明白的是,什么会导致for循环在应该递增时开始递减i值。我原本期望计数器将无限递增,直到程序耗尽内存。
我已经知道如何改进这个程序,但我想知道在for循环中计数器如何在应该递增时递减。有人能解释一下吗?
(更新:感谢大家的回答。我简直不敢相信我忘了整数溢出。我试着把变量从int改成long,但这使程序变得更慢了。不管怎样,现在我意识到计数器一直在递增,直到溢出并降至负值。)
以下是我的代码。
public class TwiceAsOld {
public static void twiceAsOld (int currentFathersAge, int currentSonsAge) {
int yearsAgo;
int yearsFromNow;
int pastFathersAge = currentFathersAge;
int pastSonsAge = currentSonsAge;
int futureFathersAge = currentFathersAge;
int futureSonsAge = currentSonsAge;
for (yearsAgo = 0; pastFathersAge != 2 * pastSonsAge; yearsAgo++) {
pastFathersAge--;
pastSonsAge--;
}
System.out.println("The father was last twice as old as the son " + yearsAgo + " years ago.");
for (yearsFromNow = 0; futureFathersAge != 2 * futureSonsAge; yearsFromNow++) {
futureFathersAge++;
futureSonsAge++;
}
System.out.println("The father will be twice as old as the son in " + yearsFromNow + " years from now.");
}
public static void main(String[] args) {
twiceAsOld(8, 3);
twiceAsOld(3, 2);
}
}
通过twiceAsOld(8, 3)函数的调用,for循环的增量似乎已经反转,从0开始递减而不是递增。在twiceAsOld(3, 2)函数中,-1可能表示一个错误,表明父亲从未是儿子的两倍年龄,也永远不会是。我不明白的是,什么会导致for循环在应该递增时开始递减i值。我原本期望计数器将无限递增,直到程序耗尽内存。
我已经知道如何改进这个程序,但我想知道在for循环中计数器如何在应该递增时递减。有人能解释一下吗?
(更新:感谢大家的回答。我简直不敢相信我忘了整数溢出。我试着把变量从int改成long,但这使程序变得更慢了。不管怎样,现在我意识到计数器一直在递增,直到溢出并降至负值。)