アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。大学でC++を習い始めたばかりの初心者です。
最近while文とwhile文と使った無限ループを知ったのですが、
両者の違いがイマイチわかりません。
私のイメージですと、while文は条件が真である限り何度でも判定し
条件が偽になればループを抜ける。
一方無限ループもif文を使った条件が真にならない限りbreakしない。

while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが…
ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

A 回答 (8件)

はい、全く同じです。

    • good
    • 0

質問の意味を完全にはよく把握していないので推察して回答します。

見当違いでしたらすみません。

if文で抜ける場合には、抜ける判定がされたときに、if文の後からloopの終わりまでのプログラムが実行されずに抜けてしまうところが実用的に異なると思います。もしそのif文をloopの最初か最後に置いたら、whileを使ったloopと同じになると思います。

あと「無限ループ」という言葉ですが、判定するif文が入って無限には続かないものは、「無限ループ」とは言わないような気がします。私は実際にプログラムを強制終了でもさせない限り回り続けるループのことを「無限ループ」と呼ぶと思っていました。ただ世の中にはそう呼んでいる世界もあるかもしれないので、確実なことは知りません。
    • good
    • 0

(1)


while ( 条件文 ) {
}

(2)
while ( 1 ) {
 if ( 条件文 ) break;
}
との違いでしょうか。
ならば#1の方の言うとおり、条件を判断する箇所が違うだけで全く同じです。要するにプログラマの好きなように書けばいいのです。
(1)の書き方は一定の条件の場合、(2)の書き方は繰り返すごとに条件が変わる場合とかに経験上、分けられます(←あくまでも個人的な私見)。
    • good
    • 0

基本的には、while( 真 ){}としているだけですから、同じものです。



違いといえば、使い方の差ですかね。

条件によって、途中で処理を中断させたい場合とか、条件によって異なる処理をさせた後でループを抜けたいとか。
もちろんwhileの中に基本的な条件をいれておいて、例外的にifで対応ということもできますが、ループを抜ける条件があちこちにかかれると、可読性が悪くなりますし。

どうすれば正しいというのはなくて、可読性やメンテナンスのしやすさといったいろいろな条件を加味して、どちらを使用するか決めることになります。
    • good
    • 0

while (true) {


 if ( !expression ) break;
 do_something();
}



while (expression) {
 do_something();
}

が同じではないか?ということで良いですか?

コンパイラから見れば同じかもしれませんが、プログラマから見ればコードの見やすさ、保守性などが違います。

# ANo.3 の人とダブッた。
    • good
    • 0

基本的には同じですが、使い方が違います。


簡単に書きます。

通常のwhile文の場合。

int i = 0;

while (i < 10) {
処理A;

  処理B;

  処理C;

  i++;
}

この場合は、処理A、処理B、処理Cをそれぞれ10回処理を行ったら、処理が終了します。

一方、無限ループと言われているやり方^^。
(実際は無限ループとは言いません。)
以下のようにコーディングします。

int i = 0;

while (1) {

  処理A;

  処理B;

  if (i < 10){
   処理C;
   break;
  }

  i++;
}

処理A、処理Bをそれぞれ10回処理して、処理Cのみ9回しか処理を行わない場合に、このように記述します。

どうですか?
処理結果が違ってきますよね。

プログラミングをする場合は、言語だけではなく、どのような処理をプログラミングするのかを考えれば、理解できると思います。

このような、回答が欲しかったのでしょうか?
因みに、無限ループは、永遠に処理が終わらない事です。

頑張って勉強してくださいね^^。
    • good
    • 0

(1)


  a = 0;
  while ( a == 0 ) {
  }

(2)
  a = 0;
  b = 0;
  c = 0;
  while ( 1 ) {
    if ( a != 0 ) break;

    if ( b == 1 ) break;

    if ( (c != 0) && ( c == b ) break;
  }

処理を抜ける条件が複数あって、1つの条件式にする事が
できない。又は、ループの途中で処理を終了させたい様な
時に、(2)の様な使い方をします。

また
(3)
void aa() {
  if ( a != 0 ) return;

  if ( b == 1 ) return;

  if ( (c != 0) && ( c == b ) return;
}

の様に複数箇所でモジュールから抜ける処理が有ると
デバッグ時に、ブレークポイントを複数設定しないと
いけませんし、設定に洩れがあると終了時の変数の値
を確認できないまま処理から抜けてしまうので(4)の
様にする場合が有ります。

(4)
void aa() {
  do {
    if ( a != 0 ) break;

    if ( b == 1 ) break;

    if ( (c != 0) && ( c == b ) break;

  } while (0);
}
この様にするとデバッグ時にも最後の行に1箇所
ブレークポイントを入れておけば、モジュール終了
時の変数値の確認ができますし、大規模システムの
場合に行われるログ出力処理も1箇所で済ませる事
ができます。
    • good
    • 0

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


そもそも、両者の定義はまったく違います。
while文はC言語などでループ(繰り返し)処理を実現するための
予約語であって、無限ループとはアルゴリズム上(実装上)での
while文の書き方の一つでしかありません。

>while文の偽と判定する部分がif文で真と判定するだけで、同じような気がする
そのとおりです、上記で書いたように書き方の一つでしかありません。
この場合、繰り返し処理を終わる可能性があるものは無限ループとは
呼びません。

無限ループというのは単に実装上で繰り返し処理の
終わり(繰り返し処理を抜ける機会)が無いループの事を
言っているに過ぎません。

int flag = 0;
while( flag==0 ){
 flag++;
}

と書こうが

int flag = 0;
while(1){
 if( flag!=0){
  break;
 }
 flag++;
}
と書こうが両者は無限ループではありません。
(厳密には多少違いますが、処理的な差異はありません)

無限ループとは以下の場合があります。
(例外やフックなどはここでは考慮しないものとします)
//flagが繰り返し処理中に変化しない場合
int flag = 0;
while( flag==0 ){
}

//変化しても抜ける機会が無い場合
int flag = 0;
while(1){
 if( flag!=0){
 }
 flag++;
}

//一番分かりやすい無限ループ
while(1){
}

などです。
ちなみにfor文では
for(;;){
}
などと書いたりします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!