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忘れに注意が必要なようです。