C言語

【C言語 条件分岐】if文の代用?break文は必須?switch文について解説【初心者】

c-language-switch.png

<この記事について>

  • 「switch文の使い方がよくわからない」などど悩んでいる方に向けて書きました。
  • この記事を読むことで、switch文の特徴や使い方、注意点が分かります。
  • 結論としては、switch文はif else-if else文のような処理が可能ですが文字列の判定や数値範囲の判定などの制約があります。各caseの中にbreak文がないとフォロースルーが発生してしまいます。

こんにちは!こんばんは!

ちゃとらです(・ω・)/

使いそうだけどなんか影が薄くて書き方も忘れそうなswitch文。

僕なりにswitch文の特徴や使い方、注意点などをまとめてみました。

ちゃとら

switch文について分かりやすい解説していきます!

switch文とは

説明

switch文とは、多方向条件処理ができる条件分岐処理の一種です。

複数の場合分けから値が合致する所の処理のみが実行されます。

if else-if else文と同じような処理を実現することができます。

しかし、文字列の判定や数値範囲の判定などの処理はできません。

// switch文の記述方法

switch(式)
{
	case 定数式1:
		~
		break;
	case 定数式2:
		~
		break;
	default:
		~
}
switch文の解説

式の値に合致した定数式のcase処理のみ実行される。どの定数式にも当てはまらない場合は、default処理のみ実行される。

式には整数の変数もしくは演算式が入る。実数は入らない。また、条件式ではない。

定数式には整数の定数か文字定数が入る。実数や条件式、文字列は入らない。

注意点としては、式には実数が入らず条件式でもないことです。

また、定数式には10や’A’などの定数は入りますが、5.5などの実数や”ABC”などの文字列は入りません。

サンプルコード

まずは、switch文を使った基本的なプログラムです。

#include <stdio.h>

int main(void)
{
	int i;
	printf("整数を入力:");
	scanf("%d", &i);

	switch (i)
	{
		case 1:
			printf("入力された値は1\n");
			break;
		case 2:
			printf("入力された値は2\n");
			break;
		default:
			printf("1,2以外の値が入力されました\n");
	}

	return 0;
}
実行結果①

整数を入力:1
入力された値は1

実行結果②

整数を入力:2
入力された値は2

実行結果③

整数を入力:100
1,2以外の値が入力されました

入力された値によって処理が切り替わっているのが分かるかと思います。

次プログラムのように、複数のcase句をまとめることもできます。

#include <stdio.h>

int main(void)
{
	char c;
	printf("1文字を入力:");
	scanf("%c", &c);

	switch (c)
	{
		case 'A':
		case 'B':
		case 'C':
			printf("入力された文字はA,B,Cのどれかです\n");
			break;
		case 'D':
		case 'E':
		case 'F':
			printf("入力された文字はD,E,Fのどれかです\n");
			break;
		default:
			printf("A,B,C,D,E,F以外の文字が入力されました\n");
	}

	return 0;
}
実行結果①

1文字を入力:A
入力された文字はA,B,Cのどれかです

実行結果②

1文字を入力:B
入力された文字はA,B,Cのどれかです

実行結果③

1文字を入力:D
入力された文字はD,E,Fのどれかです

実行結果④

1文字を入力:Z
A,B,C,D,E,F以外の文字が入力されました

このように、いくつかのcaseの処理をまとめることもできます。

用途

switch文の使い道としては、if else-if else文の代用です。

ぶっちゃけswitch文でできることはif else-if else文でもできます。むしろ、switch文の方は制約があるのでif else-if else文でできること全てをカバーできません。

しかし、プログラムによってはswitch文で書いた方が見やすくかつカッコよくなる場合があります。

ちゃとら

「switch文で綺麗にプログラム書けそうだ!」と思ったらswitch文を使ってみてください。

フォロースルー

とあるモブ

caseの最後には必ずbreak文が入っているけど必要なの?

ちゃとら

break文はよっぽどのことがないかぎり必須となります。

多くのプログラムの場合、各caseにbreak文が入っていないと自分が思うような処理ができなくなってしまいます。

caseの中にbreak文が入っていないとその後のcase処理・default処理を実行してしまうフォロースルーが発生してしまいます。

以下のプログラムは、実際にフォロースルーが発生するものです。

#include <stdio.h>

int main(void)
{
	char c;
	printf("1文字を入力:");
	scanf("%c", &c);

	switch (c)
	{
		case 'A':
			printf("入力された文字はA\n");
		case 'B':
			printf("入力された文字はB\n");
		case 'C':
			printf("入力された文字はC\n");
		default:
			printf("入力された文字はA,B,C以外の文字\n");
	}

	return 0;
}
実行結果①

1文字を入力:A
入力された文字はA
入力された文字はB
入力された文字はC
入力された文字はA,B,C以外の文字

実行結果②

1文字を入力:B
入力された文字はB
入力された文字はC
入力された文字はA,B,C以外の文字

実行結果③

1文字を入力:C
入力された文字はC
入力された文字はA,B,C以外の文字

明らかに実行結果がおかしくなってしまっていますね。

break文が各caseに入っていないと、式の値と合致するcase処理とそれ以降のcase・default処理も実行されてしまいます。

ちゃとら

フォロースルーが発生しないようにcaseの中には必ずbreak文を入れるようにしましょう!

まとめ

switch文について

  1. switch文は条件分岐処理の一種であり、if else-if else文と同じような処理が可能だが、文字列の判定や数値範囲の判定などはできない。
  2. switch(式)の式には整数の定数が入る。実数や条件式は入らない!
  3. case句の定数式には整数の定数や文字定数が入る。実数や条件式、文字列は入らない!
  4. 各caseの中にbreak文がないとフォロースルーが発生してしまい、自分の望んでいる処理が実現できなくなってしまう。
ちゃとら

switch文を使う際は、様々なルールに注意です!

今回はここまでです。

ちゃとら(・ω・)/