【发布时间】:2019-05-29 15:15:43
【问题描述】:
我写了一个方法来计算一个父亲在多久以前是他儿子的两倍,从现在开始多少年后这是真的。没想到,它为一个 8 岁的父亲和一个 3 岁的儿子返回“-2 年前”。同样出乎意料的是,它为 3 岁的父亲和 2 岁的儿子返回“-1 年后”。我不关心如何改进代码,因为我已经知道如何做到这一点。相反,我很困惑为什么 for 循环计数器在应该递增时却出现递减。
这是我的代码。
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);
}
}
使用 twoAsOld(8, 3) 时,for 循环的增量似乎已反转为从 0 倒计时而不是向上倒计时。对于 twoAsOld(3, 2),-1 可能代表一个错误,表明父亲从来没有比儿子大两倍,也永远不会。我不明白的是什么会导致 for 循环在 i 值应该增加时开始减少它。我期待计数器无限增加,直到程序内存不足。
我已经知道如何改进这个程序,但我很好奇 for 循环中的计数器在应该增加时如何减少。谁能解释一下?
(更新:感谢大家的回答。我不敢相信我忘记了整数溢出。我尝试将变量设为 long 而不是整数,但这使程序变得更慢。无论如何,现在我意识到计数器是一直递增,直到它溢出并降落在负值。)
【问题讨论】:
-
由于该值没有递减,几乎可以肯定是整数溢出。
标签: java loops for-loop increment decrement