C言語/制御文
はじめに
編集プログラミングにおいて、制御文はプログラムの実行フローを制御するために重要な役割を果たします。C言語では、条件分岐やループを用いてプログラムの流れを制御することができます。この章では、C言語のさまざまな制御文について詳しく説明し、それらをどのように使用するかを具体例を交えて学びます。
条件分岐
編集if文
編集if文は、特定の条件が真である場合にのみ、特定のコードブロックを実行するために使用されます。
- 基本構文
if (条件) { // 条件が真の場合に実行されるコード }
- 使用例
#include <stdio.h> int main() { int num = 10; if (num > 0) { printf("numは正の数です。\n"); } return 0; }
if-else文
編集if-else文は、条件が真の場合と偽の場合の両方に対する処理を指定できます。
- 基本構文
if (条件) { // 条件が真の場合に実行されるコード } else { // 条件が偽の場合に実行されるコード }
- 使用例
#include <stdio.h> int main() { int num = -5; if (num > 0) { printf("numは正の数です。\n"); } else { printf("numは正の数ではありません。\n"); } return 0; }
else if文
編集else if文を使うことで、複数の条件を連続して評価することができます。
- 基本構文
if (条件1) { // 条件1が真の場合に実行されるコード } else if (条件2) { // 条件2が真の場合に実行されるコード } else { // すべての条件が偽の場合に実行されるコード }
- 使用例
#include <stdio.h> int main() { int num = 0; if (num > 0) { printf("numは正の数です。\n"); } else if (num == 0) { printf("numは0です。\n"); } else { printf("numは負の数です。\n"); } return 0; }
厳密に言うと else if文という構文があるのではなく、else節に対応する文が if文になっている状態ですが、イディオムとして else if文と称されます。
ネストされたif文
編集ネストされたif文は、if文の中にさらにif文を入れることで複雑な条件分岐を実現します。
- 基本構文
if (条件1) { if (条件2) { // 条件1と条件2が真の場合に実行されるコード } }
- 使用例
#include <stdio.h> int main() { int num = 10; if (num > 0) { if (num % 2 == 0) { printf("numは正の偶数です。\n"); } else { printf("numは正の奇数です。\n"); } } return 0; }
三項演算子
編集三項演算子は、簡潔な条件分岐を行うための演算子です。
- 基本構文
条件 ? 真の場合の値 : 偽の場合の値
- 使用例
#include <stdio.h> int main() { int num = 5; const char* result = (num > 0) ? "正の数" : "正の数ではない"; printf("numは%sです。\n", result); return 0; }
if-else文との比較
編集三項演算子は簡潔であるため、小さな条件分岐には適していますが、複雑な条件分岐にはif-else文を使用する方がコードの可読性が高くなります。
短絡評価
編集短絡評価は、論理演算において必要以上に条件を評価しない一種の最適化手法です。
AND演算子(&&)における短絡評価
編集AND演算子を使用した場合、最初の条件が偽であれば、二つ目の条件は評価されません。
- 使用例
#include <stdio.h> int main() { int a = 0; int b = 5; if (a != 0 && b / a > 1) { printf("条件は真です。\n"); } else { printf("条件は偽です。\n"); } return 0; }
OR演算子(||)における短絡評価
編集OR演算子を使用した場合、最初の条件が真であれば、二つ目の条件は評価されません。
- 使用例
#include <stdio.h> int main() { int a = 5; int b = 0; if (a > 0 || b / a > 1) { printf("条件は真です。\n"); } else { printf("条件は偽です。\n"); } return 0; }
繰り返し文
編集for文
編集for文は、特定の回数だけ繰り返し処理を実行するために使用されます。
- 基本構文
for (初期化; 条件; 増分) { // 繰り返し実行されるコード }
- 使用例
#include <stdio.h> int main() { for (int i = 0; i < 5; i++) { printf("iの値は%dです。\n", i); } return 0; }
while文
編集while文は、条件が真である限り、繰り返し処理を実行します。
- 基本構文
while (条件) { // 繰り返し実行されるコード }
- 使用例
#include <stdio.h> int main() { int i = 0; while (i < 5) { printf("iの値は%dです。\n", i); i++; } return 0; }
do-while文
編集do-while文は、少なくとも一度は繰り返し処理を実行し、その後条件を評価します。
- 基本構文
do { // 繰り返し実行されるコード } while (条件);
- 使用例
#include <stdio.h> int main() { int i = 0; do { printf("iの値は%dです。\n", i); i++; } while (i < 5); return 0; }
ネストされた繰り返し文
編集繰り返し文をネストさせることで、二重ループなど複雑な繰り返し処理を行うことができます。
- 使用例
#include <stdio.h> int main() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { printf("iの値は%d、jの値は%dです。\n", i, j); } } return 0; }
制御文の中断と継続
編集break文
編集break文は、現在のループやswitch文から抜け出すために使用されます。
- 基本構文
break;
- 使用例
#include <stdio.h> int main() { for (int i = 0; i < 10; i++) { if (i == 5) { break; } printf("iの値は%dです。\n", i); } return 0; }
continue文
編集continue文は、現在の反復処理をスキップして次の反復処理に移るために使用されます。
- 基本構文
continue;
- 使用例
#include <stdio.h> int main() { for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; } printf("iの値は%dです。\n", i); } return 0; }
goto文
編集goto文は、プログラムの特定のラベルにジャンプするために使用されます。使用には注意が必要です。
- 基本構文
goto ラベル; ラベル: // ラベルの位置にジャンプした後に実行されるコード
- 使用例
#include <stdio.h> int main() { int i = 0; goto skip; printf("この行はスキップされます。\n"); skip: printf("この行は実行されます。\n"); return 0; }
- 注意点
- goto文はコードの可読性や保守性を低下させるため、できるだけ使用を避けるべきです。代わりに、適切な制御構造を使用することを推奨します。
switch文
編集switch文は、変数の値に基づいて複数の分岐処理を行うために使用されます。
- 基本構文
switch (変数) { case 値1: // 値1の場合に実行されるコード break; case 値2: // 値2の場合に実行されるコード break; default: // すべてのケースに該当しない場合に実行されるコード }
- 使用例
#include <stdio.h> int main() { int num = 2; switch (num) { case 1: printf("numは1です。\n"); break; case 2: printf("numは2です。\n"); break; default: printf("numは1でも2でもありません。\n"); } return 0; }
複数のcaseを扱う方法
編集複数のcaseラベルを連続して記述することで、同じ処理を行うことができます。
- 使用例
#include <stdio.h> int main() { int num = 2; switch (num) { case 1: case 2: printf("numは1または2です。\n"); break; default: printf("numは1でも2でもありません。\n"); } return 0; }
default節の使用
編集default節は、いずれのcaseにも該当しない場合に実行されるコードを指定します。
- 使用例
#include <stdio.h> int main() { int num = 3; switch (num) { case 1: printf("numは1です。\n"); break; case 2: printf("numは2です。\n"); break; default: printf("numは1でも2でもありません。\n"); } return 0; }
制御文の応用
編集制御文を組み合わせることで、より複雑なプログラムを作成することができます。ここでは、複雑な条件分岐やループの組み合わせを使った実際のプログラム例を紹介します。
- 例
#include <stdio.h> int main() { int i, j; for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++) { if (i == j) { continue; } printf("i = %d, j = %d\n", i, j); } } return 0; }
このプログラムは、iとjが等しい場合を除き、iとjの値を出力します。
まとめ
編集この章では、C言語の制御文について学びました。条件分岐や繰り返し文、制御文の中断と継続、そしてswitch文について詳しく説明しました。制御文を正しく使用することで、プログラムの流れを自在に制御し、効率的で読みやすいコードを書くことができます。
附録A: 演習問題
編集演習問題1: if文
編集変数numが正の数、負の数、または0であるかを判定するプログラムを作成してください。
演習問題2: for文
編集1から10までの整数を出力するプログラムを作成してください。
演習問題3: 短絡評価
編集短絡評価を使用して、0で除算が発生しないようにするプログラムを作成してください。
- 解答例
#include <stdio.h> int main() { int a = 0; int b = 5; if (a != 0 && b / a > 1) { printf("条件は真です。\n"); } else { printf("条件は偽です。\n"); } return 0; }