switch文 条件分岐2

switch文

if文を使えば大抵の条件分岐には対応できます。
しかし、ある変数の値に応じて複数の分岐をしたい場合にはswitch文を用いたほうが簡潔に書けます。


#include <stdio.h>

int main()
{
    char str[] = "ABC";
    int length = sizeof(str) - 1;

    switch (length)
    {
    case 0:
        printf("strは0文字");
        break;
    case 1:
        printf("strは1文字");
        break;
    case 2:
        printf("strは2文字");
        break;
    case 3:
        printf("strは3文字");
        break;
    default:
        printf("strは4文字以上");
        break;
    }
    getchar();
}
strは3文字
switch(式){ case 定数式: 文 break; [ case 定数式: 文 break; [ default: 文 break;]]}
式を評価した値とcase定数式が一致する文を実行する

switch文は、最初に丸括弧内の値を評価します。
ここに指定できるのは整数値か、計算の結果が整数型になる式です。
(「1 + 2」などの式でも良い)

次に、指定された値に一致する値が指定されたcase句を探し、その文を実行します。
一致するcase句がない場合はdefault句の文を実行します。
default句は省略することも可能です。

case句、default句の末尾はセミコロン(;)ではなくコロン(:)であることに注意してください。

case句に指定できる値は定数のみです。
(リテラル含む)
また、同じ値のcase句を重複して定義することはできません。


int num = 1;

switch (0)
{
//case句に変数は指定できない
case num:
    break;
}

switch (0)
{
case 0:
    break;

//case句の値は重複できない
case 0:
    break;
}

break文

それぞれのcase句の文の最後にはbreak文が指定されています。
コードがbreak文に到達すると、現在のswitch文やループを抜けます。
(ループに関しては別途説明します)

このbreak文を書くのを忘れると、switch文はおかしな動作となります。


#include <stdio.h>

int main()
{
    char str[] = "ABC";
    int length = sizeof(str) - 1;

    switch (length)
    {
    case 0:
        printf("strは0文字");
    case 1:
        printf("strは1文字");
    case 2:
        printf("strは2文字");
    case 3:
        printf("strは3文字");
    default:
        printf("strは4文字以上");
    }
    getchar();
}
strは3文字strは4文字以上

このswitch文の式の値は3なので、case 3:のcase句が実行されます。
しかしその後のdefault句の文まで実行されています。

これはcase句の最後にbreak文がないため、switch文の処理は中断されずそのまま次の句(今回はdefault句)にまで処理が移ってしまうのです。

あえてこの動作を利用したコードを書くこともできます。


switch (0)
{
case 0:
case 1:
	//処理A

	break;
case 2:
	//処理B

case 3:
	//処理C

	break;
}

上記コードは、条件が0または1の場合に処理Aが実行されます。
条件が2の場合は処理Bと処理Cが実行されます。
条件が3の場合は処理Cのみが実行されます。

なお、break文はswitch文内またはループ文内以外の箇所に記述することはできません。