• ベストアンサー

for文while文の無限ループの違いについて

for文の無限ループ for(; ;) と、 while文の無限ループ while(1) は、 どのように違うのですか? 処理速度やCPU負荷を考慮して、 どちらを使用するか悩んでいます。 よろしくお願いします。

  • INUK
  • お礼率46% (7/15)

質問者が選んだベストアンサー

  • ベストアンサー
  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

最適化されれば、どちらも一緒と思います。 心配?ならアセンブラのソースを出力させて確認するのが一番かと。(もしくは、デバッグでコードを確認) ちなみに、Borland Free Compilerでは、どちらのループ命令もジャンプ命令が1個生成されるだけです。 こんな感じのコードになりました loop_top: ループ内処理のコード jmp loop_top

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

よほど間抜けなコンパイラでない限り、for(;;)とwhile(1)の処理速度やCPU負荷は変わりません。 なお、インタプリタであれば、while(1)の方が、構文解析の負荷がやや大きい気はしますが、インタプリタの実装にもよるので一概には言えません。 ところで、本当に処理速度やCPU負荷がシビアなのであれば、for文やwhile文ではなく、goto文を使った方がよいでしょう。特にC++の場合、(非常に単純なものを除けば)for文やwhile文のブロック有効範囲への出入りの際に、オブジェクトの生成・解体や、例外処理のための処理が入る可能性があるからです。

関連するQ&A

  • while文と無限ループの違い

    はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

  • 無限ループとループ文

    プログラミングにおいて while文、for文、foreach文などループ文は種類がありますが 無限ループに繋がってしまう恐れが高い順などは存在しますか? どのループ文もミスなく慎重に 正確な書き方さえしていれば無限ループは起きないと思いますが もしそのような順が存在するのであれば、わからないので教えて頂きたいです。

  • ループについて

     アンケート的な質問ですが、forの無限ループと、whileの無限ループが、C言語にはありますよね?  whileの場合は、while(1)と書きますし、問題ないですが、 forの場合は、for(;;)とかきますよね。  forの無限ループって、顔文字の涙にみえないですか? for文の無限ループって、何が悲しかったのでしょうか? 答えられる方、こたえてください。

  • 無限ループの防ぐ方法

    いつもお世話になっております、While文、for文などで 無限ループが発生した場合の良い対応方法を教えて教えて いただけないでしょうか? 最小限で且つ最速な変更が 一番助かります。 ------------------------------------------------------- 【例】 for(;;){ if(iNum == 10) break; } この場合だと、iNumが10になるまで抜けない為 無限ループになりPCがフリーズしてしまいます。 ------------------------------------------------------- 【対応】 【例】 for(;;){ if(iNum == 10) break; delay(1); } 一番簡単な対応だと、delay1を入れる事により PCのフリーズが防げると思います。ですが、delay1を入れる 事により処理が重くなってしまいます。 ------------------------------------------------------- そこで教えていただきたいのは、PCがフリーズさせない ような処理は他にないでしょうか? そのような関数が100ほどあるので、出来るだけ最小限な 改造で薦めたいと思っています。 以上です。

  • 普通のfor文が無限ループになってしまうことはあるのでしょうか?

    C#のプログラミングで for (int i = n; i < n + 2; i++) { .,......... } のような普通のfor文が無限ループになってしまっていて困っています。 何か書き方が悪いのか、それともVISUAL STUDIOやパソコンの調子が悪いのでしょうか?? 教えてください。 ちなみにnは-9E17くらいのすごく小さな数です。

  • RTOSの無限ループ

    itron等のRTOSではタスク登録すれば while(1){ 処理; } という無限ループを抜けられるじゃないですか? いったいどういう仕組みで抜けているのでしょうか? ソフト的にはどうあがいても無限ループなわけで・・。 どなたか教えてください。

  • do-while文での無限ループ?

    こんにちは。 いつもお世話になっております。 現在Perlを使用してプログラムを組んでいますが、無限ループになってしまうらしく、次の画面に遷移しません。 @selected2には最大10個までの要素が入ります。(要素数は都度違う) その要素の中から$carno以外の要素を1つ選びたいのですが、このプログラムだとうまく動きません。 do-whileを取るととりあえずは動くので、条件の所が間違っているようなのですが、どう考えても正しいような気がします。 do{ if($ransuu==0){ $ransuu=int rand(11); } for($k=1;$k<=$a;$k++){ if($selected2[$k]==$ransuu){ $second=$ransuu; } } }while($ransuu==$carno || $second!=$ransuu); アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 無限ループをわざと作って時計をつくりたい

    無限ループをわざと作って時計を作ろうと思っています。 while(true){ 処理 } とすると無限ループを作ることができると書いてありましたので private void btnRedActionPerformed(java.awt.event.ActionEvent evt) { while(true) { taOutput.setText(""); Date d = new Date(); taOutput.append(d +":" ); Color c = new Color(102,255,255); taOutput.setBackground(c); Font f = new Font(Font.SERIF, Font.ITALIC, 25); taOutput.setFont(f);  } } として実行してボタンを押すと処理が止まって固まってしまうのです。 出力画面にOutOfMemoryErrorと書いてあるのでそのへんの理由だと思うのですが。 ちなみに for (int i = 0; i<5; i++) { } でテストするとうまく動きます。 これを固まらせずにうまく無限ループを続けさせるにはどうしたらいいのでしょうか。

    • ベストアンサー
    • Java
  • 無限ループについて(while true~)

    たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

  • ループを途中で抜けたいのですが。

    無限ループさせているwhileやfor文などで、 何かのキーを押すとループを抜けるように設定したいのですが可能でしょうか? (scanfやcinなどをループの中に組み込まずに。ctrl+Cも無しで。) (あと、フォーム上ではなくコンソール上で。) 多分説明不足なのでもうちょっと詳しく。 たとえば、 while ( i != 1 ){ j += 1; } の様な無限ループを設定したとして、 本来なら if (j > 100 ){ break; } とか、 while文の中に scanf ( "%d" , &i ); 等を入れて終了条件を満たさせるべきですが、 そうではなく、ひたすら無限ループを続けているところにEscキーを押すとループから脱出するようなプログラムを作ってみたいのです。 そういうプログラムは可能でしょうか? どうかご教授下さい。 使用コンパイラ:Visual C++ 2008 Express Edition

専門家に質問してみよう