ホーム - プログラミング - 制御構文

制御構文

制御構文とはプログラムの流れを記述するためのプログラミング文法のことです。制御構文では変数の値に応じて条件ごとに異なった演算をさせたり、ある条件を満たすまで繰り返し演算させたりすることが出来ます。代表的な制御構文としては条件分岐構文(if文)や繰り返し構文(for文、while文、do-while文)があります。プログラムはこれらの制御構文を組み合わせることで作られます。

また制御構文では、構文内に別の制御構文を書くことも可能です。例えば条件分岐構文の中に更に細かい条件分岐構文を記述したり、更にその細かい条件分岐の中で繰り返し構文を記述したりといった具合です。このようにある構文の中に別の構文を入れ込むことを「入れ子構造」といいます。入れ子構造を視覚的に分かりやすくするために、ソースコードを記述する際は、制御構文内のステートメントにはタブ等を入れて一段下げる(インデントする)のが一般的な記述方法です。

それでは、C#での基本的な制御構文について見ていきましょう。

条件式

制御構文ではプログラムの流れを制御するために変数の値の状態を調べるために条件式が必要になります。そして条件式は比較演算や論理演算を使って記述します。下記にサンプルを示します。

x == 5;  ---> xが5と等しければ真(true)
x == "abc";  ---> xが"abc"と等しければ真(true)
x != 5;  ---> xが5と等しくなければ真(true)
x != "abc";  ---> xが"abc"と等しくなければ真(true)
x > 5 && x < 10  ---> xが5より大きく10より小さければ真(true)
x == "abc" || x == "xyz"  ---> xが"abc"か"xyz"と等しければ真(true)
				


条件分岐(if文)

変数の値を条件式を使って判別し、状況に応じて違った動作をさせることを条件分岐といいます。条件分岐にはif文という構文を使います。if文は、

if (条件式1)
{
	〜 条件式1が真(true)の場合の処理 〜
}
else if (条件式2)
{
	〜 条件式1が偽(false)で条件式2が真(true)の場合の処理 〜
}
else if (条件式3)
{
	〜 条件式1、2が偽(false)で条件式3が真(true)の場合の処理 〜
}
	・
	・
	・
else
{
	〜 全ての条件式が偽(false)の場合の処理 〜
}
				
と書きます。ここで1つめの条件は「if」で書き、2つめ以降の条件は「else if」、全ての条件を満たさない場合は「else」で記述します。そして、それぞれの条件の処理は中カッコ { } でくくります。条件が1つしかない場合は「else if」は省略できます。また、全ての条件を満たさない場合の処理が必要ない場合は「else」も省略できます。下記にサンプルを示します。

int x = 7;
string answer = "";

if (x >= 5 && x <= 10)
{
    answer = "HIT";
}
else if ( x > 10 )
{
    answer = "OVER";
}
else
{
    answer = "SHORT";
}
				
上記のサンプルでは、xが5以上10以下ならanswerに「HIT」、10より大きければ「OVER」、5より小さければ「SHORT」という文字列が代入されます。ここでは一番初めにxに7が代入されているので、answerには「HIT」という文字列の値が入ります。

繰り返し(for文)

制御構文では何らかの条件を元に繰り返し同じ処理を実行するような記述ができます。大きく分けるとfor文とwhile文があります。まずはfor文から見ていきましょう。

for文は主に「繰り返しカウント(回数)が分かっている場合」の繰り返し処理に使用します。後述のwhile文のような繰り返し条件に関する柔軟性はありませんが繰り返し処理をスマートに記述することができます。for文は、

for(カウント変数の初期化; 条件式; カウント変数の更新)
{
	〜 繰り返し実行する処理 〜
}
				
と書きます。ちょっと分かりにくいと思いますので、下記に例を示します。

int i;
int answer = 0;

for (i = 1; i <= 10; i++)        //i++ は i = i + 1と同じです。
{
    answer += i;        //answer = answer + i; と同じです。
}
				
上記の例ではカウント変数の初期値として1を代入(i = 1)し、iを1から10まで(i <= 10)1ずつ増やしながら(i++)、answerに順番に足し算しています。結果としては「1+2+・・・+10=55」という答えがanswerに入ります。

繰り返し(while文、do-while文)

繰り返し処理を記述する際には、繰り返し回数が分からない処理もあります。そのような場合は条件式を満たしている間は処理を繰り返すwhile文やdo-while文を使用します。処理の記述はfor文のようなスマートさには欠けますが、繰り返し条件を柔軟に記述することができます。繰り返し際には毎回処理の開始前に条件を確認するときはwhile文を、毎回処理の実行後に条件を確認するときはdo-while文を使います。それぞれ下記のように書きます。

(while文)
while (条件式)
{
	〜 繰り返し実行する処理 〜
}

(do-while文)
do
{
	〜 繰り返し実行する処理 〜
} while (条件式);
				
こちらもちょっと分かりにくいと思いますので、例を見てみましょう。
(while文の場合)
int i = 1;
int answer = 0;
while (i <= 10)
{
    answer += i;
    i++;
}

(do-while文の場合)
int i = 1;
int answer = 0;
do
{
    answer += 1;
    i++;
} while (i <= 10);
				
上記の例もfor文と同様に1から10までを足し算しています。for文よりも記述が複雑にはなりますが、同じ結果が得られます。for文と違って、answerが100を超えない間は足し算を繰り返すといった条件記述も可能です。

入れ子構造

前述しましたが、制御構文は入れ子構造が可能です。下記に例を示します。
int i;
int answer1 = 0;
int answer2 = 0;

for (i = 1; i <= 10; i++)
{
    if (i % 2 == 1)
    {
        answer1 += i;
    }
    else
    {
        answer2 += i;
    }
}
				
上記の例で1から10について奇数の分だけの足し算(answer1)と偶数の分だけの足し算(answer2)を別々に行うようにソースコードを記述しています。制御構造は通常、入れ子構造になることが大半ですので、上記の例のように、中カッコ { } の中はタブ等で一段下げて(インデントを入れて)記述するようにしましょう。