第10回

後回しにしていたforとその仲間たち

00/06/28 解説文の追加
98/11/06 IE4.xに対応させた
98/04/29メールアドレス訂正
98/03/24一部訂正&何度か追記


今回は、第7回よりずっと後回しにしていたforと、その仲間たち(?)とも言うべきif-elseswitchwhiledo-whileについてです。では、さっさと終わらせましょう。(^_^;

if-else(elseは省略可)
if ()
    式が真の時に実行する処理
else
    式が偽の時に実行する処理

if-else文は、「もし・・・が・・・ならば、・・・をする。でもって、そうじゃない時は・・・をする。」といった判定を行いたい時に使います。もちろん以下のように、「そうじゃない時」の後に、さらに判定を行うことも可能です。

if(式)
    処理
else if(式)
    処理
else if(式)
    処理
else
    処理
それと、式が真の時の処理が複数の文である場合は、{}で囲んでブロック化する必要があります。そのことはif文だけではなく、この後で学ぶ繰り返し文でも言えることです。
ただし、
if(a==10){
    b=1;
    c+=3;
    d=b+c;
}
みたいに、複数の文といっても単純な式などであれば、
if(a==10)b=1,c+=3,d=b+c;
といった具合に、カンマで連結して1行にまとめることができます。これは私が好んで使う手だったりします。(^_^)
あと、BASICに染まっている人に注意してもらいたいのが、
if(a==10)b=1;c+=3;d=b+c;
と書いた場合、a==10が真の時に処理されるのは、あくまでb=1です。その後にあるc+=3とd=b+cは、a==10が真偽のどちらであろうと、必ず処理されてしまいます。つまり、
if(a==10)b=1;
c+=3;
d=b+c;
だということです。BASICでいうところの、
if a=10 then b=1:c=c+3:d=b+c
と誤解しないで下さい。

因みに、

c+=3;
は、
c=c+3;
と同じ意味です。

if-else文の詳細についてはK&R2第3章3.2、3.3を参照して下さい。


switch(defaultは省略可)
switch(){
    case 定数または定数式:処理終了後switchから抜け出す時はbreakまたはreturn文を用いる
    case 定数または定数式:処理終了後switchから抜け出す時はbreakまたはreturn文を用いる
   ・
   ・
   ・

    default:デフォルトの処理breakを置いておく
}

例えば、

   if(a==1)
       printf("勇者は、ちくっと痛みを感じたゾ。\n");
   else if(a==50)
       printf("勇者は冷や汗タラリもんのダメージを与えられた。\n");
   else if(a==99)
       printf("勇者、瀕死っス。\n");
   else
       printf("勇者はさくっとかわした。ざまあみろっと。\n");
みたいに、判定する式がすべて「a==何か」のように同じケースで統一されている場合、switch文を使うことでプログラムをスマートにすることができます。っていうか、switch文が使えるのに、if-else文を使うのはちょっぴり恥ずかしい気がします。上記if-else文をswitch文にすると以下のようになります。
switch(a){
    case  1:printf("勇者は、ちくっと痛みを感じたゾ。\n");
        break;
    case 50:printf("勇者は冷や汗タラリもんのダメージを与えられた。\n");
        break;
    case 99:printf("勇者、瀕死っス。\n");
        break;
    default:printf("勇者はさくっとかわした。ざまあみろっと。\n");
        break;
}
switch文についての詳細は、K&R2第3章3.4を参照して下さい。

while
while()
    式が真の時に実行する処理
whileは、()の中の式が真である限り、ある処理を繰り返して実行させたい時に使います。このwhileや次のdo-while、そしてforは、処理を繰り返す(ループさせる)時に用いられることから、繰り返し文と呼ばれています。
で、このwhileの繰り返し条件である「式が真」とは、すなわち「式が0で無い」ということですので、 while(1)とすることで、処理を永遠にループさせることができます。
それと、if文同様、繰り返し文においても、式が真である時に実行する処理が複数の文の時は、{}で囲んでブロック化する必要があります。
whileについての詳細は、K&R2第3章3.5を参照して下さい。

do-while
do
    式が真の時に実行する処理
while();
さっきのwhileは、初めから式が偽になっていると、ループ時の処理が一度も行われません。それに対してdo-whileは、式による判定が行われる前に、一度ループ時の処理を通過します。つまり、式の真偽を問わず、最低でも1回はループ時の処理が行われるというのがdo-whileの特徴です。
詳細はK&R2第3章3.6を参照して下さい。

for(式1、式2、式3は省略可。ただしセミコロンは省略できない)
for(式1初期値を設定;式2繰り返し条件;式3文を実行した後の再初期化式)
    式2が真の時に実行する処理

forを使う際、以下のようなプログラムは無限ループに陥ってしまうので注意して下さい。

int i;
for(i=0;i<40000;i++) 実行する処理;
なぜかというと、ループカウンタである変数iのデータ型がint型であるからです。int型の上限は32767です(LSI C-86 Ver. 3.30c試食版などでは)から、繰り返し条件式(i<40000)は真であり続ける、つまり処理を永遠に繰り返す結果となってしまうのです。
あ、それと、i++は、i=i+1と同じ意味です。
forの詳細はK&R2第3章3.5を参照して下さい。

おっと、もう1つ。
ここで紹介したforif-elseswitchwhiledo-whileはあくまでです。関数ではありませんので、for関数とか言わないように!

つづく。


[メニュー][第9回][第11回]

いーざ
email:CQP00202@nifty.ne.jp