まだテスト中 -2ページ目

まだテスト中

使い方の勉強中です。


Cライクな言語では、必ず1回は処理を実行する繰り返し処理を do-while で書いたりします。

それで、先日下記のようなコードを書いたのですが、はまってしまいました。どこがいけないかわかりますか。(C#の例)
static void Main(string[] args)
{
  int cnt = 0;
  {
    Console.WriteLine("cnt=" + cnt.ToString());
    cnt++;
  }while(cnt < 10);
  Console.WriteLine("done");
  Console.ReadLine();
}
これ、doが無いんです。

do無しdo-whileはビルドできる

それならコンパイル時にエラーになるのではないかと思ったりするのですが、予想に反して、ちゃんとビルドできてしまうのです。 (Visual Studio 2010 express, 2012 express で)

しかし、実行してみるとやはり正常には動作せず、whileの{}の中の処理を一度だけ実行して停止してしまいます。ただ、停止と言ってもリソースモニターのCPU負荷は上がっています。もしかして無限ループ?。

でも、コンパイラーの問題じゃない

エラーが出ないことからコンパイラのバグか?とか一瞬思ったりするのですが、これで正常です。上記のコードをよく眺めていると、do-whileの部分が下記のように書き直せることに気づきます。
int cnt = 0;

{
  Console.WriteLine("cnt=" + cnt.ToString());
  cnt++;
}

while(cnt < 10) /*空文*/ ;
なんと、中括弧のブロックを(1回)処理して、空文を無限に繰り返すというコードになっています。doを忘れただけで構造が変わってしまうんですね。

do-whileでは最後のセミコロンを忘れがちですが、それ以上にdo忘れに注意が必要なようです。