[前へ]   [目次へ]   [次へ]

while ループと do ループ(C/C++)

今回は、C/C++の for while do の三種類のループの一つ、
while と do について解説します。

まずは while から解説します。

while は for に比べるとシンプルです。
while の基本構文は以下のようになります。

while(継続条件) 

「継続条件」は for と同じものですが、空にすることはできません。
無限ループにしたいときは常に真になるように1とか書いておけばOKです。

while ブロックの実行手順を図にすると、以下のようになっています。
(1)「継続条件判定」→(2)「(1)が真なら(3)、偽なら終了」。(3)「whileブロック内コード実行」→(4)「whileブロック内でreturnかbreakを実行したら終了、continueを実行するかブロックの終端に行ったら(1)」。

簡単に言ってしまえば、 for ループから「初回式」と「続行式」を削除しただけで、その他の特徴は同じです。
ただし、 while では「続行式」がないため、
ループ数をカウントする時はブロック内に加算を記述しなければいけません。

前回のサンプルと同じ動作を while を使って記述すると以下のようになります。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
#include <stdio.h>

int main(void)
{
   
int i;
   i=0;
//初回式にあたる部分はループ開始前に実行します。
   
while(i<3){
      puts(
"ブロック構文");
      puts(
"その2");
      i++;
//続行式にあたる部分を忘れずに記述しないと、無限ループしてしまいます。
   }
   i=0;
   
while(i<3)puts("一行構文"),i++;//(1)一行構文
   //終了待ち
   
getchar();
   
return 0;
実行結果:
ブロック構文
その2
ブロック構文
その2
ブロック構文
その2
一行構文
一行構文
一行構文


(1)13行の一行構文は、 while でも使用することはできますが、
続行式と実処理の二行分必要なことが多いため、あまり出番がありません。
上の例は無理やり一行に丸め込んだものですが、 , 演算子は見づらいのであまり推奨はしません。
,演算子は、基本的に何もせず、二つの式を一つにまとめるだけです。
という訳で、 while を使用するときは基本的にブロック構文を用いることになります。


次に、 do について解説します。
do ループは while ループから初回の条件判定をなくしたものです。

do の基本構文は以下のようになります。

do{
   
//ブロック内にコードを記述。
}while(継続条件) 

do ループはブロック終了時に単独の while を必要とします。
while を最後にくっつけなければならないため、 do はブロック構文しか使用できないように見えます。
しかし、少なくともVisual C++6.0では妙な構文で一行構文が使えました(笑)

do ブロックの実行手順を図にすると、以下のようになっています。
(1)「doブロック内コード実行」→(2)「doブロック内でreturnかbreakを実行したら終了、continueを実行するかブロックの終端に行ったら(3)」。(3)「継続条件判定」→(4)「(3)が真なら(1)、偽なら終了」。

上の例と同じ動作を do ループで書くと以下のようになります。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
#include <stdio.h>

int main(void)
{
   
int i;
   i=0;
//初回式にあたる部分はループ開始前に実行します。
   
do{
      puts(
"ブロック構文");
      puts(
"その2");
      i++;
//while同様、続行式にあたる部分を忘れずに記述しないと、無限ループしてしまいます。
   }while(i<3);//(1)最後のwhileは浮いているように見えますがちゃんとdoとくっつきます。
   
i=0;
   
do puts("一行構文"),i++;while(i<3);//(2)一行構文。妙すぎです(笑)
   //終了待ち
   
getchar();
   
return 0;
実行結果:
ブロック構文
その2
ブロック構文
その2
ブロック構文
その2
一行構文
一行構文
一行構文


(1)11行の while は、 do の直後にある場合に限り、 do の継続条件として認識されます。
do を使用した後に while が続かないとエラーになります。

(2)13行の一行構文はもはやなんだか分かりませんが、一応動作するようです。
しかし、こんな謎すぎるものは使わないに越したことはありませんね(笑)
忘れちゃってもいいでしょう(笑)

という訳で、 do にはやっぱりブロック構文しかないようです。
というより、無いということにしておいた方がイロイロ平和でしょう、多分(笑)


さて、三種類のループについて見てきましたが、この例では for を使う例が一番スッキリ見えたでしょう。
これらのループは特徴の違いから、それぞれ得意用途が異なっています。
例が for の得意とするものだったため、 for が一番スッキリ見えただけのことであり、
他のループが使われない、ということはありません。

また、得手不得手があるとはいえ、基本的にはどのループを使っても処理を記述することはできます。
覚えきれないならどれか一つだけをとりあえず覚えておく、という手もあります。
最終的には効率的に選択できるという意味で、全てのループを使えるようになってください。


次回は、これら三種類のループの得意とする条件について解説します。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17