無限ループ(無限ループ)

無限ループ

  • 死のサイクルがあり、サイクルの終わりではありません(無限ループ/無限ループ)
  • ので、無限ループが発生したいかなるセット終了条件が存在しない、ループの終了条件は、完全にすることが非常に重要である様々なボーダーの状況を考えます

場合は、上記の演習(nは見つける番号は数字で割り切れることができます)でのエッセイは、例えば、不足累積数の条件、それは条件式を行います会うことはありませんプログラムはなりそうという、実行されませんこれは、無限ループを生成します。

パブリック クラスFindDivEndless {
     公共 静的 ボイドメイン(文字列[]引数){
         int型はn = 5 int型の配当= 100 ;
        int型除数= 89 ; 

        int型は、 = 0が見つかりました

        一方、(見出さ< N){
             場合(配当%除数== 0 ){ 
                System.out.printlnは(配当 + "可以被" +除数+ "整除商为" +(被除数/ 除数))。
            } 
            配当 ++ 
        } 
    } 
}

 

特例

  • 5つの番号を見つけるためにしばらくは20億で割り切れることができます
  • 最終的なプログラムはまだ終了します
パブリック クラスFindNDivNotEndless {
     公共 静的 ボイドメイン(文字列[]引数){
         int型 N- = 5 ; 

        int型の配当= 100 ;
         INT除数= 2000000000; // int型の範囲内の数値オーバーフロー

        INTが = 0を発見し

        一方(見出さ< N- ){ 

            IF(%配当除数== 0 ){ 
                見出さ ++ ; 
                のSystem.out.println(配当 +は+除数+ "分割一覧です。" "であってもよい" +(被除数/ 除数)); 
            } 

            配当 ++
        } 
    } 
}

 

 この理由は、20億最大int型の値に近い、とは累積値ダウンオーバーフローが発生するということです。

バイナリに加え、次いで、プラス最上位ビットは1になり、コンピュータに追加し、格納されたバイナリ値を補数形式で表されます。

したがって、最上位の符号ビットは、それが第二の理由の数が負に見出される理由である負の数となり、1です。

たった5を見つけることが割れるかもしれしたがって、もし、私たちは、1、-1、0、1を続ける-1これはダウンを繰り返しています。

だから、どのようにそれを否定する結果に数値のオーバーフローの問題を解決するには?

 

サイクルを終了するbreak文を使用します

  • 任意のループを終了する文を破ります
  • 負の場合を考慮せずに、ブレークの問題を解決
パブリック クラスFindNDivBetter {
     公共 静的 ボイドメイン(文字列[]引数){
         int型 N- = 5 ; 

        int型の配当= 100 ;
         INT除数= 2000000000. ; 

        intが = 0見出さ; 

        列スタート = +配当"から" + "スタート" ; 

        一方(実測値< N-){
             // whileループ配当値は、全体アウトオーバフロー。
            IF(配当<0 ){ 
                するSystem.out.println( "配当オーバーフロー計算終了!" );
                 BREAK ; 
            } 

            IF(%配当除数== 0 ){ 
                見出さ ++ ; 
                のSystem.out.println(配当 +は+除数+ +(配当"であってもよい" / " 割り切れるリストである。" 除数)); 
            } 

            配当 ++ ; 
        } 

        システム。 out.printlnを(スタート + "合計" +見出さ+ +除数+ "分割" "可能" ); 
        のSystem.out.println(配当); // 結果は-2147483648、実際に負の数です。
    } 
}

おすすめ

転載: www.cnblogs.com/buildnewhomeland/p/12158384.html