我写了一种方法来计算父亲多久以前是儿子的两倍,以及从现在起多少年才是真实的。出乎意料的是,它为一个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);
}
}
使用twoAssAsOld(8,3),for循环的增量似乎已经反转,从0开始倒数而不是向上倒数。在doublesAsOld(3,2)中,-1可能代表错误,表明父亲从未比儿子大两倍,而且永远也不会。我不明白的是什么会导致for循环在本应递增的情况下开始递减i值。我期望计数器无限期地增加,直到程序用尽内存。
我已经知道如何改进该程序,但是我很好奇for循环中的计数器在应该增加时如何减少。有人可以解释吗?
(更新:谢谢大家的回答。我不敢相信我忘记了整数溢出。我尝试使变量变长而不是整数,但这使程序变慢了。无论如何,现在我意识到计数器一直在递增直到它飞过并降落为负值。)
最佳答案
之所以变成负数,是因为当int计算溢出时,这就是Java中发生的情况。
看一眼
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.2
它说
关于java - 什么会使for循环在应该增加的时候减少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54015399/