● 流れの制御

条件分岐やループはプログラムが電卓と抜本的に異なり 膨大な処理を可能にする機構である。

■ 条件分岐

条件分岐のための条件そのものを表す方法を先に紹介する。

▲ 関係演算子

関係演算子は両辺の値の大小関係などを表す。
< 左辺が右辺より小さいなら1、さもなくば0を表す。
> 左辺が右辺より大きいなら1、さもなくば0を表す。
<= 左辺が右辺より小さいか等しいなら1、さもなくば0を表す。
>= 左辺が右辺より大きいか等しいなら1、さもなくば0を表す。
== 左辺が右辺と等しいなら1、さもなくば0を表す。
!= 左辺が右辺と等しくないなら1、さもなくば0を表す。
等しいことを表す == を間違えて = としてしまうことが よくある。こうすると条件判断が大幅に狂う。

▲ 論理演算子

例えば b<a かつ a<c の様に複数の関係演算子の結果を まとめるのが論理演算子である。
! 否定 !(a>b) として、 a>b なら0、さもなくば1を表す。
&& かつ (b<a)&&(a<c) として、 b<a かつ a<c なら1、さもなくば0を表す。
|| または (a<b)||(c<a) として、 a<b または c<a なら1、さもなくば0を表す。

▲ if文

関係演算子や条件演算子の結果によって後続の命令を実行するかしないかを 分岐させる機構が if 文である。
if( a>b ){
   // execute some commands;
}
文字通り if a>b ならば中括弧で囲まれた部分の命令が実行され、 さもなくば実行されない。optionに else 文がある。
if( a>b ){
   // execute some commands;
}else{
   // execute some commands;
}
if の条件が満たされない場合には else に続く中括弧で囲まれた部分の命令が実行される。 これで2分岐となる。 else の直後にさらに if 文をおくことで多分岐となる。
if( a>b ){
   // execute some commands;
}else if( a==b ){
   // execute some commands;
}else{
   // execute some commands;
}
最後の else 付属の命令は、それまでのすべての if 文の 条件が満たされない場合に実行される。

▲ switch文

多分岐専用の機構が switch 文である。 整数の変数の値に応じて分岐される。
switch( n ){
case 0 :
   // execute some commands;
  break;
case 1 :
   // execute some commands;
  break;
default :
   // execute some commands;
  break;
}
switch 文の小括弧 () に指定した整数の値が0に等しければ case 0 : 以降の命令が実行される。 break 文で switch 文の中括弧から実行は抜け出される。 この break 文が無いと次の case 1 : 以降の命令も実行される ことになる。すべての case に該当しない場合には default : 以降の命令が実行される。

■ ループ

プログラムのある範囲を何度も繰り返して実行させる機構を総じて ループと呼ぶ。C言語には3種類のループ機構が容易されており、 繰り返し動作の設定の仕方が多少異なり、それぞれに適した用途がある。

▲ whileループ

while ループは単純なループ機構であり、指定する項目は ループを繰り返す条件だけである。
while( a<b ){
   // execute some commands;
}
while ループでは繰り返し条件がループ上端で検査される。 この例では a<b の条件が満たされている間、中括弧で囲まれた部分 の命令が繰り返し実行される。条件が破れると中括弧以降の次の命令へと 実行は移される。

条件式として単に while(1) とすることがよくある。これは 無限ループとなる。後述の break 文を用いてループを強制終了する ことなる。この手法はループの条件が簡単には思い付かない場合には 便利である。

プログラムの実行が while ループに突入する時にもこの条件が 検査されるので、場合によってはループの中身が一度も実行されないことも ある。


▲ do whileループ

do while ループではループ下端で繰り返し条件が検査される。
do{
   // execute some commands;
}while( a<b );
while の小括弧の後のsemicolonを忘れずに。 do while ループの利点はループ突入時に繰り返しが判断できない 場合にも使えることである。結果的に、 do while ループでは最低1回は ループを回ることになる。

▲ forループ

for ループはもっとも多用されるループ機構である。 ループ繰り返し条件の指定の他にもループ突入時の初期化作業の指定と 次の回に移る際の更新作業の指定が行える。
for( i=0 ; i<10 ; i++ ){
   // execute some commands;
}
for 文の小括弧 () には3つの項目領域があり、semicolonで それらを区切る。1番目の項目にはループ突入時の初期化作業を指定する。 この例では整数 i の値を 0 にしている。2番目の項目には ループ繰り返し条件を指定する。3番目の項目には、{}ループを 次の回に進める際の更新作業を指定する。この例では i の値を 1 増加させている。

for ループの動作を要約すると、ループ突入時に1番目の項目の作業が 行われて、次に2番目の項目の繰り返し条件が検査され、それが満たされて いれば中括弧内の命令が実行される。それが終ると、3番目の項目の更新作業 が行われ、また2番目の繰り返し条件が検査され、再び中括弧内の命令が実行 される。これを繰り返して、繰り返し条件が破れた段階でループから脱出して for ループ以降へと作業が移される。

各項目にはさらにカンマで区切ることにより 複数の作業を指定することができる。2番目の項目については、カンマで 並んだ作業のうち、最後の作業の結果が繰り返し条件となる。

for( i=0, j=10 ; i<10 ; i++, j-- ){
   // execute some commands;
}
for 文の1番目の初期化項目で for ループの中で走る指標 (running index)を宣言することもある。
for( int i=0 ; i<10 ; i++ ){
   // execute some commands;
}

▲ break文とcontinue文

以上3種のループ機構で共通して使える便利な命令に break 文と continue 文がある。

break 文は既に switch 文でも登場したが、この文で 実行はループ内から脱出され、ループ以降へと移される。 これはループ繰り返し条件以外の特別の 理由でループを終了する場合に使う。

for( i=0 ; i<10 ; i++ ){
   // execute some commands;
   if( /* special condition */ ) break;
}
continue 文でループ内の作業は一回飛ばされる。 或る回の状態ではループ内の作業を行いたくない場合に使う。
for( i=0 ; i<10 ; i++ ){
   if( i==5 ) continue;
   // execute some commands;
}

▲ goto文

goto 文はプログラムの実行を関数内の別の所へ移動させる 命令である。 goto 文は多用すると実行の流れがわかりにくい 醜いプログラムとなるのでプログラマから忌み嫌われている命令である。 しかし、次の様に利用すると逆に作業の流れが明確になる。
for( i=0 ; i<10 ; i++ ){
  for( j=0 ; j<10 ; j++ ){
    if( /* special condition */ ) goto LOOP_OUT;
   // execute some commands;
  }
}
LOOP_OUT:;
これは多重ループの内側ループからある条件でループの大脱出を行う。 break 文ではループ1つしか抜け出せないので この目的には goto 文が有効である。

goto 文の行き先の指定には任意の文字列のラベルを 使うことができる。ラベルをラベルとして扱うことの宣言はない。 ラベルの場所の指定は、ラベルの後ろに : (colon)を付ける。



  • 次へ
  • 目次
    Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
    渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp