3 その他の制御構造

3.1 ループからの脱出

場合によっては,継続条件式が正しくても,構文から抜け出たい場合がある.このとき, break文を使う.通常はif文を伴って,次のように書く.
書式
	while(継続条件式){
	   文1;
	  if(制御式) break;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する.ただし,制御式が正しけ れば,この構文から抜ける」となる.当然,制御式が誤り(偽)であれば,これら文は実行 されず,ブロックの外側に出る.図1にこの構文のフローチャートを示す. ここでも,while文に,break文を用いているが,fordo while文 にも使える.いずれの構文でも,break文に出会うと,構文から抜け出る..

以下のようなプログラムが,この構文の使用例である.

#include <stdio.h>

int main(void){
  int i;

  for(i=0; i<10; i++){
    printf("i = %d\n",i);
    if(5<i)break;
    printf("------\n");
  }

  return 0;
}
実行結果は,次のようになる.
i = 0
------
i = 1
------
i = 2
------
i = 3
------
i = 4
------
i = 5
------
i = 6
図 1: break文を用いた構文からの脱出
\includegraphics[keepaspectratio, scale=1.0]{figure/break.eps}

3.2 ループのスキップ

場合によっては,ループブロックの文を実行させたくない場合がある.このとき, continue文を使う.通常はif文を伴って,次のように書く.
書式
	while(継続条件式){
	   文1;
	  if(制御式) continue;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する.ただし,制御式が正しけ れば文2と文3はスキップする.」となる.当然,制御式が誤り(偽)であれば,これら文は実行されず,ブロックの外側に出る.図2にこの構文 のフローチャートを示す.ここでは,while文に,continueを用いているが, fordo while文にも使える.いずれの構文でも,contine文に出会うと, それ以降のループブロックが実行されない.

以下のようなプログラムが,この構文の使用例である.

#include <stdio.h>

int main(void){
  int i;

  for(i=0; i<10; i++){
    printf("i = %d\n",i);
    if(5<i)continue;
    printf("------\n");
  }

  return 0;
}
実行結果は,次のようになる.
i = 0
------
i = 1
------
i = 2
------
i = 3
------
i = 4
------
i = 5
------
i = 6
i = 7
i = 8
i = 9
図 2: contineを使って,ループブロックをスキップする構文
\includegraphics[keepaspectratio, scale=1.0]{figure/continue.eps}

3.3 無条件分岐

強制的にプログラムの制御を移す.goto文が示すラベルに実行が移る.if文と共 に用いられることが多い.もちろん,単独で使用することも可能である.

ただし,goto文はプログラムの流れがわかりにくくなりますので,使わないほうが 良いとされている.行儀の良いプログラムを書くためにはgoto文は使わないことに なっている.ただし,初心者が書くような短いプログラムであれば使っても良いでろう. 簡単だし,行儀が悪くてもプログラムを書くことに慣れる方が重要である.上達したら, goto文を書かないようにすればよい.

ラベル名の後ろには,セミコロンではなく文の前に書いてコロンをつける.

図 3: goto文とラベルによる制御
\includegraphics[keepaspectratio,scale=1.0]{figure/goto.eps}



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年10月12日


no counter