興味深い問題実際にはどちらの場合もループは無限ではありません
しかし、それらの間の主な違いは、いつ終了するかと、x
最大int
値を超えて2,147,483,647
オーバーフロー状態になり、ループが終了するまでにかかる時間です。
この問題を理解する最良の方法は、簡単な例をテストしてその結果を保存することです。
例:
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
出力:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
この無限ループをテストした後、終了するのに1秒未満かかります。
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
出力:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
このテストケースでは、プログラムの実行を終了して終了するのにかかる時間に大きな違いがあることに気づくでしょう。
忍耐力がないと、このループは無限であり、終了しないと思いますが、実際には、終了してi
valueでオーバーフロー状態になるまでに数時間かかります。
最後に、printステートメントをforループ内に置いた後、printステートメントのない最初のケースのループよりもはるかに時間がかかると結論しました。
プログラムの実行にかかる時間は、特定の処理能力(プロセッサ容量)、オペレーティングシステム、およびプログラムをコンパイルしているIDEのコンピュータ仕様によって異なります。
私はこのケースをテストします:
Lenovo 2.7 GHz Intel Core i5
OS:Windows 8.1 64x
IDE:NetBeans 8.2
プログラムが完了するまでに約8時間(486分)かかります。
また、forループのステップ増分i = i + 1
が、最大のint値に到達するための非常に遅い要因であることがわかります。
より短い時間でループをテストするために、この係数を変更し、ステップの増分をより速くすることができます。
それを入れi = i * 10
てテストすると:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
出力:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
ご覧のように、前のループに比べて非常に高速です
プログラムの実行が終了して完了するまでに1秒もかかりません。
このテスト例の後、問題を明確にし、Zbynek Vyskovsky-kvr000の回答の妥当性を証明する必要があると思います。また、この質問に対する回答になります。
x
増加するため、2番目のループは無限です。つまり、上限に達することはないため、ループは「永久に」実行されます。まあ、永遠ではありませんが、ある時点でおそらくオーバーフローが発生します。j
j