ループの基本 (while 文)

 

今回は while 文を使って遊んでみます。

"while 〜" は、〜のあいだ、という意味です。

while( 中身 ) の中身も、前のページの、if( 中身 ) と同じく、0か、そうでないか( non-zero : ノンゼロ ) が重要です。このことは、for( ; この部分 ; ) 文の条件判定部分 (この部分) でも同じです。

while 文では、( ) の中身が non-zero の間だけ実行内容が永遠に繰り返され、0になるとループは中断して、次の制御に移ります。ともあれ、やりましょう。

 

以下の例では、while 文の条件部は、1 で、これでは常に 1 だから、そこの部分だけ見れば、これは永遠に続く 「無限ループ」です。



//
// program "challange3.cpp"
// bcc32
-tW challange3.cpp

#include <windows.h>

int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow )
{
int ret ;

while( 1 ) {
ret = MessageBox( NULL , "
続けますか?" , "Continue Anyway ?" , MB_OKCANCEL | MB_APPLMODAL ) ;
if( ret == IDOK )
continue ;
else
break ;
}

return 0 ;
}




コンパイルして実行すると、「続けますか?」 に 「OK」 と答えているは、延々とプロセスは終了せず、質問攻めにあいます。質問攻めに飽きたら 「CANCEL」 を選択してください。

 

まず、while( 1 ) の部分は、これが原因でコンパイラから 「警告」 されてしまいます。while 文のすこしきれいでない使い方のように思われるのですが、よく使う書き方でもあるので、示してあります。この部分のみに注目すれば、この while 文は、条件は常に「真」(ゼロでない) だから、"永遠に" 続いてしまうことになります。今回の場合では、「CANCEL」 を選択すると、break ; のところに制御がいくので、そのおかげで、ループは終了し、ループから抜け出します。

 

continue 文は、「繰り返し文」 のループの最後に制御を移す、または単純にジャンプする、ための文です。最後といってもループから抜け出すのではありません。break は、ループから抜け出すということはつまり、break は、} の直後、continue は、} の直前、にジャンプする、と言えばすこし整理できます。また、必ず ; がついて、continue ; となります。

continue 文は、break に比べると、遥かに使用頻度が落ちるものです。本当はこの例では使用しなくても済みます。文法的な意味は少し異なってきますが、今回の場合は、if( ret == IDOK ) continue ; を、if( ret == IDOK ) ; のようにしても、やりたいこととしてはおんなじです。

また、break , continue 文は、for 文でも同じ使われ方をします。

 

わたくしとしては、かなりプログラムが書きたいだけなので、先の例は、ほんとうはこんなふうにコンパクトにしたかったのです。


//
// program "challange3.cpp"
// bcc32
-tW challange3.cpp

#include <windows.h>

int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow )
{
while( IDOK == MessageBox( NULL , "続けますか?" , "Continue Anyway ?" , MB_OKCANCEL | MB_APPLMODAL ) ) ;
return 0 ;
}


見比べてみましょう。おぉ!なんとコンパクトなのでしょう。

変数 ret は使いません。だから int ret ; による宣言が不要で、while の条件吟味部分が、 ifbreakcontinue を使ったループ脱出の仕組みを、それ一つで兼ねています。   ・・・まずなにしろ繰り返しがやりたいから、まず while( 1 ) と書いて、えーっとそれから・・・、と組んでいくと、おそらく先の例のようになりますね。たくさんのコードに触れていくと自然と見通しがよくなってくるので、自然と後者のようなコードを書くようになります。

 

... MB_APPLMODAL )) ; のようになっているところは、... MB_APPLMODAL )) {} のようにすることもできます。これらは、「(演算を)何もしない」 ことを表しています。あまり意味がありませんが、... MB_APPLMODAL )) {;} でも同じことです。{} の中身には、複数の実行単位を記述することができます。どんなときでも常に {} をつかう習慣にしておけば問題はありませんが、省略して ; を使い始めたら、; の付け忘れに注意です。例えば上の例で ; を忘れてしまったら、while( ... ) return 0 ; というコードになってしまい、この手のミスは結構痛いバグとなるのです。

... MB_APPLMODAL )) {;} ; としてしまうと、若干意味が異なってきます。最後の ; は無意味な ; には違いありませんが、赤い部分とは独立した、一つの実行単位になるからです。

 

 if 文でも、if( ret == IDOK ) のような書き方ができましたが、while() 文でも同じです。while( ret == IDOK )... (ただそれは、書き方はそういうことができるということで、上の例では・・・、おそらくメッセージボックスは一度も出ないで終了するのではないでしょうか・・・)
 そして、if 文も、while 文も、for 文も、( ) の中身が、 0 か そうでないか(non-zero) が重要です。

 

※ 条件が真、とは、条件評価の値が non-zero のこと(0でないこと)。反対は、「偽(ぎ)」で、0 のことです。関係ありませんが、マイナスの数(負)ではありません。マイナスの数は、0ではないから、「真」です。

 

上記2例とも、同じ内容のプログラムです。

実行は、コンパイル後、challange3 [リターン] です。

 

こりゃしつこいなぁ・・・

 

つぎは、Coffee Break.(ここでのことの補足を少々と、宣言だの定義だの、言葉のおはなし)

 

[トップ] [インデックス] [前へ] [次へ]