lC言語 分岐(ジャンプ) '96.11.14  
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
.C言語_ 3 フォ-マットコ-ド 6 演算子 9 FOR  集合デ-タ  目的別
1 表示してみる 4 変数と定数 7 条件判断 10 WHIILE  ポインタ     
2 エスケ-プ コ-ド 5 デ-タ入力 8 分岐   未使用  関数   ★ 
分岐  無条件分岐 goto  多重分岐 switch case  参考 
便利ですが必要ではありません。後回しにしましょう。 

分岐(ジャンプ)
コンピュータはメモリに書かれたプログラムの内容を順番に処理します。
コンピュータが読んでいるメモリの位置を変更する命令が分岐命令です。
関数などのサブルーチンコールの場合は、分岐先の仕事が終るとまた元の位置に戻ってきますから、Cのプログラムを作る場合には分岐を意識する必要はありません

関数の中で、次に書かれている命令ではなく別な行に書かれている命令を処理したい場合に、分岐命令を使います
この命令によって、コンピュータが実行しているプログラムの流れが、そこから別な位置に変るわけです。

プログラムの流れを変更する分岐命令には、一定の条件のときに分岐させる条件分岐と、無条件に分岐させる無条件分岐が有ります。
分岐命を行うためには、分岐先を指定する必要がありますから、分岐先にはラベルを付けておきます
ラベルは、START:; のように、: を付けて書きます。もちろん ; も必要です。
ラベルと同じ行に式などを書くときは、START: gets(S); のように、スペースかタブで区切って書きます。


無条件分岐 goto ラベル:
分岐します。
一定の条件のときにだけに分岐させる条件分岐と区別するために、無条件分岐と呼ばれます。
goto START; /* START: に分岐します。*/

以下に、無条件分岐の例を示します。無限ループの例です。
#include<stdio.h>			/* ここに stdio.h を挿入します。OK */
void main()				/* 以下、処理の内容。*/
{
  char buf[128];			/* 文字配列を宣言します。*/

START:;					/* ラベルを付けます。*/
  printf("短文を入力して下さい。頭文字 E で終了します。");
  gets(buf);
  if((buf[0]=='E')||(buf[0]=='E'))	/* E または e なら、*/
  { printf("%s...と入力されました。\n",buf);	/* 入力を表示します。*/
    goto OWARI;					/* OWARI に分岐します。*/
  }
  else					/* E または e 以外なら、*/
  {
    printf("%s...と入力されました。\n\n",buf);	/* 入力を表示します。*/
    goto START;					/* START に戻ります。*/
  }
OWARI: printf("終了しました。\n");	/* ラベルを付けます。*/
}
なお、この場合は goto OWARI;が有るので、else は必要ではありません。

無条件分岐は、プログラムがわかり難くなるので、参考書などには、多重ループから抜け出す場合の他は使用しない方がよいと書かれています。


多重件分岐 switch case
複数のラベル位置に、条件に応じて分岐させる命令です。
ラベル名には case を使用し、このラベル名 case は変更できません。
ラベル名 case は、int型の定数と組み合わせて、case 5 のように書きます。
case 5 は、分岐条件の値 X が 5 になったときの分岐先です。
switch(X)		/* X は、分岐条件の値です。(変数や式など。) */
{
  case A: 処理A;	/* X=A のとき、処理A〜処理d が実行されます。*/
  case B: 処理B;	/* X=B のとき、処理B〜処理d が実行されます。*/
  case C: 処理C;	/* X=C のとき、処理C〜処理d が実行されます。*/
  default: 処理d;	/* 処理d が実行されます。*/
  /* A B C には、int型の定数だけを使用できます。*/
}
switch によって、例えば case A: に分岐した場合、その後に分岐命令がなければコンピュータは、処理B 処理C 処理d の順に続けて処理を行います。
つまり、case A: に分岐した後は、ラベルに無関係に順番に処理されて行きます。
ラベルは必要な数だけ書きます。 default は省略できます。

ある条件の処理を一つだけにする場合は、次に示す break を使います。

継続(continue)と中断(break;)
switch(X)		/* X は、分岐条件の値です。(変数や式など。) */
{
  case A:		/* X=A のとき、*/
  { 処理A;			/* 処理A を実行します。*/
    break;			/* { } の外に出ます。*/
  }
  case B:		/* X=B のとき、*/
  { 処理B;			/* 処理B を実行します。*/
    break;			/* { } の外に出ます。*/
  }
  case C:		/* X=C のとき、*/
  { 処理C;			/* 処理C を実行します。*/
    continue;			/* ループの中にある場合だけ使えます。*/
  }
  default: 処理d;	/* 上記以外の場合、処理d が実行されます。*/
}
continue は、この後に出てくるループ処理用の命令です。
switch() がループの中にある場合、continue をループに中の switch(){ }の中に書くことができるという意味でここに書いています。

多重分岐のプログラム例を示します。
キーボードから 1〜5 を入力して、その値によって表示方法を変えています。

#include<stdio.h>		/* ここに stdio.h を挿入します。OK */
void main()			/* 以下、処理の内容。*/
{
  int N=1;
  printf("1〜5 を入力して下さい。: ");	/* */
  scanf("%d",&N);	/* キーボードから数を入力します。*/
  switch(N)		/* N は、分岐条件の値です。(変数や式など。) */
  {
    case 5:		/* N=5 のときは 555 を表示します。*/
    { printf("%d%d%d%d%d ",N,N,N,N,N);}
    case 4: break;	/* N=4 のときは、何もしないで終了します。*/
    case 3:		/* N=3 のときは、 333 を表示します。*/
    { printf("%d%d%d ",N,N,N);}
    case 2:		/* N=2 のときは、 22 を表示します。*/
    { printf("%d%d ",N,N);}
    case 1:		/* N=1 のときは、 */
    {
      printf("%d ",N);	/* 1 を表示します。*/
      break;		/* {} の外に出ます。*/
    }
    default:		/* 3〜7 以外の場合は、メッセージを表示します。*/
    { printf("3〜7 にして下さい。\n");}
  }
  printf("\n終了します。\n");
}


参考 

コンピュータの動作のレベルで考えると、関数も、無条件分岐に含まれます。
#include<stdio.h>  /* ここに関数 printf があります。*/
void main()	
{ int X;
  X=5;
  printf("%d\n",X); /* 関数 printf に分岐して、5 を表示してからここに戻ります。*/
  X=7;
  printf("%d\n",X); /* 関数 printf に分岐して、7 を表示してからここに戻ります。*/
}

同様に、条件判断は、条件分岐に含まれます。
if(X==Y) {printf("同じ");} else {printf("違う");}

X=Y の場合、最初の{ } の処理の後、次の{ } を飛び越します。
X≠Y の場合、最初の{ } を飛び越して、次の{ } を処理します。
この場合の分岐先は2つ目の{}とその次の文ですが、そのラベルはCが勝手に作ります。

ソースファイルを実行ファイルに変換すると、START: などのラベルは、その位置を示すメモリ上のアドレス(のポインタ) に変換されます。


参考 : フロー制御
プログラムは、普通は書いてある順番に実行されます。
goto if else などの分岐命令が書かれていると、別な部分の処理に移ります。
このようにして、
プログラムの流れ(フロー)を変えることは、フロー制御といいます。

C言語の関数は、その呼出し位置( printf(); などを書いてある位置) で処理されると考えることができるので、プログラマがフロー制御を書く必要はありません。
実行プログラムにコンパイルすると、
  printf(); の呼出し位置から、
  stdio.h の中の printf(); を実行して、
  再び stdio.h の呼出し位置(の次の位置) の処理をする
ような プログラムになります。これはコンパイラが勝手にやってくれます。
もし、C言語のように関数が用意されていないアセンブラを使う場合には、 そのためのフロー制御をプログラマが書く必要があります。


参考 : フローチャート ( flow chart : 流れ図 )
プログラムなど、何かの処理を図にして表わしたものです。
プログラムを作る最初に、どのように作るかを 考えたりするのに使われます。

例 1〜10の和を作る
      ┌───────────────────┐
      │定数と変数を用意し、初期化する    │
      │  1と10             │
      │  N=0  処理の回数 1〜10  │
      │  S=0  和を代入して行く    │
      └─────┬─────────────┘
   ──→──→──→┤( 条件によっては、再びここに戻って処理します。)
  │   ┌─────┴─────────────┐
  │   │    N=N+1 加える数 12・・│
  ↑   └─────┬─────────────┘
  │   ┌─────┴─────────────┐
  │   │    S=S+N   和の計算   │
  ↑   └─────┬─────────────┘
  │         /\
  │        /  \
  ↑       /    \   条件分岐をします。
  │  ←NO / N=10 に \
    ̄ ̄ ̄ ̄ ̄ \ なったか?/  分岐先からここまでのループは、
          \    /   for() や while() などを使えば
           \  /    一つの式で書くことができます。
            \/
        YES↓│
      ┌─────┴─────────────┐
      │  S=1〜10の和 が得られます。 │
      └───────────────────┘




T


C言語 7 条件判断 8 分岐 9 FOR
 
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html