アットウィキロゴ

PG講座3

ダイジェスト。


さて、ここまで変数と関数の宣言と、変数をいじくる方法については述べた。
しかし、まともなコンピュータプログラムを書きたいならば、条件分岐と繰り返し処理は確実に必要である。

  • 条件分岐
条件式を満たしているか否かによって、実行する命令(またはブロック)を変える処理。
if-elseif-else と、switch-case-defaultがある。(一般的にはif文、switch文と呼ばれる)
if文の例を示す。

#include<stdio.h>
#define MODE 0
int main(void)
{
	int i = MODE;
	if(i == 0)printf("mode 0;");
	else if(i == 1)printf("mode 1");
	else printf("unknown mode.");
	return 0;
};
 
このように、else ifを使うことができる。else ifは何回でも重ねることができるが、後述するswitch文の方が適している場合がある。
なお、これはブロックを用いない方法である。
ブロックを用いると、
#include<stdio.h>
#define MODE 0
int main(void)
{
	int i = MODE;
	if(i == 0)
	{
		printf("mode 0;");
	}
	else if(i == 1)
	{
		printf("mode 1");
	}
	else
	{
		printf("unknown mode.");
	}
	return 0;
};
 
とも書ける。この二つは同意の処理である。しかし、後者の処理の場合はあくまでブロックを実行しているため、ブロックの中にある複数の命令を一気に実行できる。

次に、switch文。
#include<stdio.h>
#define MODE 0
int main(void)
{
	int i = MODE;
	switch (i)
	{
		case 0:
			printf("mode 0.");
			break;
		case 1:
			printf("mode 1.");
			break;
		default:
			printf("unknown mode.");
	}
	return 0;
};
 
switch文は、if文よりも、多くのケースの処理を分けるのに適している方式である。
その代わり、分岐を判別するための変数は一つ限りで、条件式らしい条件を与えることもできない。
また、break文は必須である。breakしない場合、そのまますぐ下のケースの処理に入ってしまう。
しかしこれを利用することで、指定した複数のケースの時に同じ命令を実行させることもできる。
つまり以下のようにできる。

#include<stdio.h>
#define MODE 0
int main(void)
{
	int i = MODE;
	switch (i)
	{
		case 0:
		case 1:
			printf("known mode.");
			break;
		default:
			printf("unknown mode.");
	}
	return 0;
};
 
これは、i == 0 および i == 1の時と、 それ以外の時とで分岐している。


  • 繰り返し文
繰り返し文はいくつかあるが、二つだけ紹介する。
whileとforである。
whileはもっとも単純な繰り返し処理で、与えた条件式が正しい(真の(trueの))時のみ繰り返し、そうでないときは繰り返さずに次の処理に移る。

以下は実行してはならない。
#include<stdio.h>
int main(void)
{
	int i = 0;
	while(1)
	{
		printf("hoge\r\n");
	}
	return 0;
};
 
while(1)とは、何があろうと永久にループし続けることを意味する。言語によってはwhile(true)ともいう。
そのため、危険だということに注意すべきだ。
では、これではどうだろうか。
#include<stdio.h>
int main(void)
{
	int i = 0;
	while(i < 10)
	{
		printf("hoge\r\n");	
		i++;
	}
	return 0;
};
 
無限ループではなくなった。
また、
#include<stdio.h>
int main(void)
{
	int i = 0;
	while(1)
	{
		printf("hoge\r\n");	
		i++;
		if(i >= 10)break;
	}
	return 0;
};
 
これでも同様に動作する。
break文によって制御するのは、基本的に無限ループにしつつ、ある条件を満たしたときのみループを終えるという設計の際に有用である。
ゲームは基本的に、アップデート処理と描画処理を交互に行い、特定の動作をしない限り永久にそれを続けるため、breakによって制御する方式は分かりやすい。
無論、同じ処理をwhileの条件式にするのでもよい。好きな方法をとるといい。

次に、for文。
for文とは、ループ処理に入ろうとするときの処理と、ループするかどうかの条件式と、処理を終えて次のループへ入る直前の処理と、を与えて動く繰り返し文である。
#include<stdio.h>
int main(void)
{
	for(int i = 0; i < 10; i++)
	{
		printf("hoge\r\n");
	}
	return 0;
};
 
前述のものと同じように動くのだが、随分とすっきりしたのがわかるだろうか。
なお、環境によってはint i を別に宣言する必要があるかもしれない。しかし、最近のコンパイラならばこのままで動くだろう。



  • 使い分け
このように、条件分岐と繰り返し文は幾通りかのやり方がある。
忘れないでほしいのは、これらはプログラム次第で相互に代替できるということだ。
ゆえに、使い分けは実はさほど重要ではない。
無論、使い分けられるならば読みやすいソースになるだろうが、趣味のプログラムならばあまり気にする必要はない。
参考までに、whileは無限ループのみで使い、他はできるだけforを使うという方式を提示しておく。個人によって最適解は異なるので、模索してほしい。
最終更新:2013年04月30日 12:01