コンテンツにスキップ

C言語/制御文

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに

[編集]

プログラミングにおいて、制御文はプログラムの実行フローを制御するために重要な役割を果たします。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;
}