do-while文

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

do-while文は、C言語やそれに似たプログラミング言語にあるで、制御構造のひとつである。繰り返す対象の後に置かれた、ブーリアン型[注釈 1]の条件式を評価した値の真偽によって、ループを打ち切るか続けるかという動作をする。

まずキーワードの do、続いてコードのブロック(文であればよく、ブロックでなくともよい)、最後にキーワードの while、丸括弧で囲んだ条件式、セミコロン、という構文である。最初にブロック中のコードが実行され、次に条件が評価される。条件がであれば、ブロック中のコードが再び実行される。条件がになるまで、これを繰り返す。while文との違いは、ループに入る前の条件の評価が無く、まず必ず1回はループ本体が実行されることである。

do-while文の制御に関してひとつ注意が必要なことは、continue文の働きについてである。非常に多くの場合に、理解の不正確な教育者などによる教材などが「continue文はループの先頭に戻る」と説明している[要出典]。そのため、do-while文では無条件でループの次の繰返しに入るといったように思ってしまいがちであるが[誰?]、それは間違っている。正確には、continue文は「ループ本体の終わり」に飛ぶもので、do-while以外のループの場合はそこでループによって先頭に戻るのであるが、do-while文の場合は条件式の判定が行われ、それでループが続くかどうかが決まる。

C言語に似ない言語では、異なった構文で同様の機能を持つものもある(while文の記事も参照)。例えばPascalでは、"repeat until" 文である。untilという名前の通り、条件が"真"になるまでループが継続する。

C言語のプログラム例:

int x = 0;
do {
   x += 1;
} while (x < 3);

この例では、最初に x += 1 を実行し x == 1 となる。次に条件の x < 3 をチェックする。条件は真であり、コードブロックを再度実行する。変数 x がループ脱出条件に合致する(x >= 3 になる)まで、コードの実行と条件のチェックを繰り返す。

[編集]

以下の、各言語によるdo-while文ないし同様の制御を利用したプログラムは、与えられた数の階乗を計算する。

Ada[編集]

with Ada.Integer_Text_IO;

procedure Factorial is
  Counter   : Integer := 5;
  Factorial : Integer := 1;
begin
  loop
    Factorial := Factorial * Counter;
    Counter   := Counter - 1;
    exit when Counter = 0;
  end loop;

  Ada.Integer_Text_IO.Put (Factorial);
end Main;

ActionScript[編集]

var counter:Number = 5;
var factorial:Number = 1;
do {
   factorial *= counter;
   counter --;
} while (counter > 0)
trace(factorial);

Visual Basic .NET[編集]

Dim counter As UInteger = 5
Dim factorial as ULong = 1
Do
  factorial *= counter 'multiply
  counter -= 1 'decrement
Loop While counter > 0
System.Console.WriteLine(factorial)

C言語C++[編集]

unsigned int counter = 5;
unsigned long factorial = 1;
do {
  factorial *= counter--; /*Multiply, then decrement.*/
} while (counter > 0);
printf("%lu\n", factorial);

C#[編集]

uint counter = 5;
ulong factorial = 1;
do
{
    factorial *= counter--;
}
while (counter > 0);
System.Console.WriteLine(factorial);

D言語[編集]

uint i = 0;
do {
    ++i;
    writefln(i);
} while(i < 5);

Java[編集]

int counter = 5;
long factorial = 1;
do {
  factorial *= counter--; //Multiply, then decrement.
} while (counter > 0);
System.out.println(factorial);

REALbasic[編集]

Dim counter As Integer = 5
Dim factorial as Integer = 1
Do
  factorial = factorial * counter // multiply
  counter = counter - 1 // decrement
While counter > 0
MsgBox Str( factorial )
Loop

Fortran[編集]

      Program FACTORIALPROG
      Integer start
      Integer factorial,counter
      Data Start /5/
      Factorial = 1      
      Counter = Start
      do while(counter>0)
        Factorial = Factorial*counter
        Counter = Counter-1
      end do
      print *,Factorial
      End Program

Pascal[編集]

program FactorialProgram;
var
  counter, factorial: Integer;
begin
  counter := 5;
  factorial := 1;

  repeat
    factorial := factorial * counter;
    counter := counter - 1;
  until counter = 0;

  Write(factorial);
end.

C/C++のマクロにおける利用[編集]

C/C++におけるdo-while文の特殊な用法に、最後にセミコロンが付く構文であることを利用し、展開結果にブロックを含むマクロの呼出しを関数のように見えるものにする、というイディオムがある。

#if NDEBUG
#define DEBUG_LOG(msg)
#else
#define DEBUG_LOG(msg) do { \
  if (msg) { printf("%.*s\n", (int)strlen(msg), msg); } \
} while (0)
#endif

void some_function()
{
    DEBUG_LOG("debug message");
}

これを利用することで、「セミコロンを付けてはいけないマクロ」という、扱いが面倒なものを作らずにすむ[1]

注釈[編集]

  1. ^ C言語にはブーリアン型は無く、実際にはint型である。

脚注[編集]

[ヘルプ]