私は、これは本当だろうか長年今から父は彼の息子と同じくらい古いとで二度あったか、ずっと前に計算するための方法を書きました。意外なことに、それは返す「-2年前の」8歳の父親と3歳の息子のために。同様に、予想外に、それは返す「-1年後から」3歳の父親と2歳の息子のために。私は、私はすでにこれを行う方法を知っているので、コードを改善する方法を懸念しておりません。代わりに、私は、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);
}
}
twiceAsOld(8、3)では、ループの増分のための0の代わりに、アップからダウンカウントするように自分自身を逆転しているように見えます。twiceAsOld(3、2)では、-1は、父親が息子として昔の倍はありませんでしたし、決してになることを示すエラーのために立つかもしれません。私は理解していないことは、それが増分になっていたときにループのI値をデクリメントを開始させるようなものです。私は、プログラムがメモリ不足になるまで無期限にインクリメントするカウンタを期待していました。
私はすでに、このプログラムを改善する方法を知っているが、私は増加することになっていたときに、forループでカウンタが減少することができる方法について興味があります。誰もがこれを説明することはできますか?
(UPDATE:あなたの答えのおかげでみんな私は、整数オーバーフローを忘れてしまった信じることができない私は、変数のlong型の代わりに、整数を作ってみましたが、これはさらに遅いプログラムを作っとにかく、今私はカウンタはすべてに沿ってインクリメントされたことを実現します。。。 overflewそれまでと負の値に上陸しました。)
それはint型の計算がオーバーフローしたときに、Javaで何が起こるかあるので、それは負になりました。
見てくださいhttps://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.2を
これは、と言っています
整数加算がオーバーフローした場合、その結果は、いくつかの十分に大きな2の補数フォーマットで表されるように、数学的和の下位ビットです。オーバーフローが発生した場合、その結果の符号は、二つのオペランド値の数学的な和の符号と同じではありません。