4

このループが終了する理由を解明しようとしています...

@Test
public void test() {

    int counter=0;
    int from = 0;
    int until = Integer.MAX_VALUE;

    while(counter <= until) {
        counter++;
        if(counter < from) {
            System.out.println("continuing " + counter + " <= " + from);
            continue;
        } 
    }
    System.out.println("finished " + counter);
}

while(counter <= until)trueカウンタは Integer.MAX_VALUE を超えて増やすことはできないため、常に解決する必要があります。したがって、ループは終了してはなりません。

ただし、Eclipse で JUnit ランナーを実行すると、次のようになります。

finished 108772

デバッガーで実行すると、次のようになります。

finished 125156

の出力if(counter < from)は決して出力されません。そのブロックを削除しても、今度は Integer.MAX_VALUE でコードが終了します。

finished 2147483647
4

2 に答える 2

0

ここで何をしようとしているのかよくわかりませんが、 while ループは期待どおりに機能しますが、 from は決して変更されないため、「 from 未満のカウンター」は実行されませんか?

(max int) まで = 2147483647

while ループを (counter < until) に変更すると、「finished 2147483647」という出力テキストが得られます。

その助け?

于 2013-04-03T18:17:55.610 に答える
0

あなたの出力を再現できないので、これは答えではなく、単なる観察です。これらの行だけを考えてください。

int counter=0;
int until = Integer.MAX_VALUE;
while(counter <= until) {
    counter++;

while 条件は「より小さいか等しい」です。したがって、counter が Integer.MAX_VALUE と等しい場合、それに 1 が追加されます。これにより、可能な限り最大の Java 負数が生成されます。この値に 1 を追加し続けると、最終的にゼロになり、Integer.MAX_VALUE に達するまでもう一度カウントアップします。その後、シーケンス全体が最初からやり直されます。私には無限ループのように見えます。

また、最大の負の数からカウントアップしながら、各反復で「継続」行を実行します。

于 2013-04-03T19:19:22.643 に答える