C言語/C++のif文, else if文, switch文などの場合に応じた処理を解説!

今井

こんにちは!今井(@ima_maru)です。

今回は、C言語やC++で、プログラムの流れを制御する「場合に応じた処理」についての解説記事を書きたいと思います。

初めてプログラミングを学ぶと、わからないことだらけだと思います。

  • if文って何!?
  • switch文って何!?
  • 場合に応じた処理って何!?

こんなような疑問を持つ方もいると思いますので、初学者にもわかりやすいよう心がけて記事を書いていきます。

わからないことがあれば、twitterでお待ちしています。

それでは解説に移ります。

場合に応じた処理とは

まず、プログラミングにおいて「場合に応じた処理」とは何でしょうか?

場合に応じた処理とは「~~だったら○○する。」などの条件を含んだ処理のことを言います。

日本語の例でいうと、

  • 明日晴れだったらピクニックに行く
  • 明日雨だったら読書をする

このような文を表すことができるのが、場合に応じた処理ということになります。

これを使うと、条件によって行う処理を変える、条件分岐するプログラムを書くことができるようになります。

たとえば、入力された値が0以上であったら「負の値ではない」と返し、0未満であったら「負の値である」と返すようなプログラムを作れます。

以下がそのサンプルコードです。

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int number;

	// 値を入力
	cout << "値を入力してください:"; 
	cin >> number;

	// 場合に応じた処理
	if (number >= 0) {
		cout << "負の値ではない\n";
	}
	else if (number < 0){
		cout << "負の値である\n";
	}

	return 0;
}
実行結果1
値を入力してください:-1
負の値である
実行結果2
値を入力してください:1
負の値ではない
実行結果3
値を入力してください:0
負の値ではない

このように、入力された値によって表示を変えることができます。

このように、if文をはじめとした場合に応じた処理を学ぶことで、ある条件によって動作を変えるというプログラムを作ることができるようになります。

この記事では、以下の場合に応じた処理を学びます。

  1. if文
  2. if-else文
  3. if-<else if>-else文
  4. switch文

この4つをおさえておけば大丈夫です!!

まずは一番簡単な「if文」から解説します。 それでは解説に入ります。

if文の構造

それでは実際にif文という構文を使って場合に応じた処理を作ってみます。

まず初めに、if文の構造を学びます。

if文の構造
if(条件) {
	// 条件がtrueなら処理される
}

if文は主に「条件」と「処理」の二つの要素から成り立っています。

  • 条件 → true か false の bool値
  • 処理 → 条件がtrueであれば読まれる

条件は、比較演算子論理演算子といったものであらわされることが多いです。

そして処理はこの{ }内に書かれます。

条件がtrueの場合はこの処理がすべて行われ、条件がfalseの場合はこの処理はすべてスキップされます。

実際に見てみましょう。

案内


”ホリエモン”が絶賛した未経験専用のプログラミングスクール
「AIに奪われない仕事をしたい!」
「将来性のあるエンジニアになって周りより稼ぎたい!」
  • 学びたい言語を好きなだけ学習するなら『TECH::CAMP』
  • 今すぐ即戦力エンジニアになるなら『TECH::EXPERT』

if文を使って場合に応じた処理をする

それではこのif文を使って場合に応じた処理というものを実現してみましょう。

if文の構造
if(条件) {
	// 処理
}

今回書くプログラムは、キーボードから入力した値が3未満であれば「3未満」と表示するというものです。

キーボードから入力した値が3未満であれば「3未満」と表示するプログラム例

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int number;

	// 値を入力
	cout << "値を入力してください:";
	cin >> number;

	// 場合に応じた処理
	if (number < 3) {
 		cout << "3未満";
	}

	return 0;

}
実行結果1
値を入力してください:2
3未満
実行結果2
値を入力してください:4
どうでしょうか。

入力した値が3未満であれば「3未満」と表示し、

入力した値が3未満でなければ何も反応しないと。

まるでコンピュータが自分の意志を持って振る舞いを変えているようです。

このように、場合に応じた処理をつかうと、

条件を付けてその条件を満たすときだけ処理を実行する

ということができるようになるわけです。

if-else文とは

if文を理解しているのであれば、if-else文は簡単です。

if-else文は、if文にelse文というものが合体しただけです。

else文って何のことにゃ!

ぷーにゃん

今井

else文は、if文の条件に当てはまらなかったときに読まれる処理だよ。

else文は簡単です。

if文の条件に当てはまらなかったときに読まれる処理を記述します。

つまり、if文の条件がtrueの時にはif文が読まれ、if文の条件がfalseの時にはelse文が読まれます。

if-else文の書き方はこんな感じ。

if-else文の構造
if(条件) {
	// 条件がtrueの場合の処理
}
else {
	// 条件がfalseの場合の処理
}

elseのほうには条件を書かなくてよいことが特徴的です。

つまり、ifの条件に合わなかったときにelseのほうの処理が実行されるわけです。

elseという英語に「他」という意味があるのでそれと一緒に覚えるといいですね。

実際に例を示します。

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int number;

	// 値を入力
	cout << "値を入力してください:";
	cin >> number;

	// 場合に応じた処理
	if (number < 3) { cout << "3未満"; }
	else { cout << "3以上"; }

	return 0;

}
実行結果1
値を入力してください:2
3未満
実行結果2
値を入力してください:4
3以上

if文では3以上の場合は何も表示されませんでしたが、今回はelse文によって3未満でない処理、つまり3以上の処理をちゃんと表示するようにすることができました。

if-else文は場合分けされていて、今回のプログラムだと3未満の場合と3未満でない(すなわち3以上である)場合で分けられています。

ifの後ろの{ }には条件がtrueの場合に実行される処理を書き、elseの後ろの{ }には条件がfalseの場合に実行される処理を書きます。

else文は条件外の処理を記述するということを覚えておきましょう!

案内


”ホリエモン”が絶賛した未経験専用のプログラミングスクール
「AIに奪われない仕事をしたい!」
「将来性のあるエンジニアになって周りより稼ぎたい!」
  • 学びたい言語を好きなだけ学習するなら『TECH::CAMP』
  • 今すぐ即戦力エンジニアになるなら『TECH::EXPERT』

if-<else if>-else文とは

なんとも見出しがややこしいのですが、if文には、

  • if文
  • else文

のほかに、

  • else if文

というものが存在します。

言葉で説明するのだと紛らわしいので、構文を見てみましょう。

if-<else if>-else文の構造
if(条件1) {
	// 条件1がtrueの場合の処理
}
else if(条件2) {
	// 条件1がfalse→条件2がtrueの場合の処理
}
else if(条件3) {
	// 条件1,条件2がfalse→条件3がtrueの場合の処理
}
...
else {
	// 上記の条件に該当しない処理(else文省略可)
}

このif-<else if>-else文は、if-else文にもう一つ以上条件を付け加えた形です。

無理やり言葉で表現するならば、

  • if文「もし~~なら○○して」
  • if-else文「もし~~なら○○して、それ以外だったら××して」
  • if-<else if>-else文「もし~~なら○○して、それ以外の時で△△だったら□□して、それ以外だったら××して」

ともう一つ条件1に当てはまらなかった場合の条件2(,3,4…)を付け足すことができます。

実際にif-<else if>-else文を使ったプログラムを見てみましょう。

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int number;

	// 値を入力
	cout << "値を入力してください:";
	cin >> number;

	// 場合に応じた処理
	if      (number < 0)   { cout << "0未満"; }
	else if (number > 100) { cout << "100より上"; }
	else                   { cout << "0以上100以下"; }

	return 0;

}
実行結果1
値を入力してください:-10
0未満
実行結果2
値を入力してください:110
100より上
実行結果3
値を入力してください:50
0以上100以下

このように場合分けが3つなされているのがわかると思います。

そして、このif-<else if>-else文には、とても特徴的な仕様と使い方があります。

それが、

一度どれかの条件に当てはまってしまえばほかの処理は実行されない

ということです。

このことは、成績を使って解説します。

一般的な成績のつけ方は、

  • 90点以上はSランク
  • 80点以上はAランク
  • 70点以上はBランク
  • 60点以上はCランク
  • 60点未満はDランク

こんな感じでしょうか?

これをif-<else if>-else文で表現するとこうなります!

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int score;

	// 値を入力
	cout << "点数を入力してください:"; 
	cin >> score;

	// 場合に応じた処理
	if      (score >= 90)  { cout << 'S'; }
	else if (score >= 80)  { cout << 'A'; }
	else if (score >= 70)  { cout << 'B'; }
	else if (score >= 60)  { cout << 'C'; }
	else if (score >= 0)   { cout << 'D'; }

	else { cout << "適正な値を入力してください"; }

	return 0;

}

このプログラムを実行して、点数を入力してみます。

実行結果1
点数を入力してください:95
S
実行結果2
点数を入力してください:89
A
実行結果3
点数を入力してください:40
D
実行結果4
点数を入力してください:-10
適正な値を入力してください

このように表現することができました。

先ほども書きましたが、ポイントは、

一度どれかの条件に当てはまってしまえばほかの処理は実行されない

ということです。

この構文の主な処理は、

  • 条件がtrueならその文のみを処理してif文全体を終える
  • 上の条件がfalseなら次の条件を評価していく

というようになっています。

上の実行例では95点はすべての条件でtrueになります。

C++
// 場合に応じた処理
if      (score >= 90)  { cout << 'S'; }
else if (score >= 80)  { cout << 'A'; }
else if (score >= 70)  { cout << 'B'; }
else if (score >= 60)  { cout << 'C'; }
else if (score >= 0)   { cout << 'D'; }

しかし実際コンソールには「S」とだけ表示されほかの文は実行されていません。

実行結果
値を入力してください:95
S

これは先ほどの「上からプログラムを読んでいって、初めて条件がtrueの文に当たった瞬間ほかの文は処理されない」というところが肝になっています。

なので以下のようにプログラムを書き換えると、正しく表示されません。

C++
// 場合に応じた処理
if      (score >= 90)  { cout << 'S'; } 

else if (score >= 0)   { cout << 'D'; } // 順番を変えた

else if (score >= 80)  { cout << 'A'; } 
else if (score >= 70)  { cout << 'B'; } 
else if (score >= 60)  { cout << 'C'; } 
実行結果1
値を入力してください:95
S
実行結果2
値を入力してください:90
S
実行結果3
値を入力してください:89
D

「89点でD評価かよ!」ってことになってしまいました。

これは先にD判定の条件を持ってきてしまい、順番が狂ってしまったのが原因です。

0点以上という条件が先に評価されてしまうので、たとえ80点以上(A判定)であってもEが先についてしまいます。

評価が「S」か「E」に二分化されてしまいました。

何が言いたいかというと、if-<else if>の条件には順番がある、これに気を付けてほしいということです。

switch文とは

switch文は上で書いたif文達とは少し書き方が異なります。

if文は条件がtrueなら実行という形でしたが、switch文は式の値によって場合分けします。

switch文の構造
switch(式) {
	case 式の値1:
		処理;
		break;
	case 式の値2;
		処理;
		break;
	case 式の値3;
		処理;
		break;
	...
	default:
		処理;
}
if文は毎回条件を書いてそれが「trueか?falseか?」で条件分岐していましたが、switch文では一つの式の値で場合分けをして条件分岐します。

例えば、式が「さいころの目」式の値が「1,2,3,4,5,6」で場合分けされたプログラムを作ってみると、以下のようになります。

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int number;

	// 値を入力
	cout << "サイコロの出目を入力してください:"; 
	cin >> number;

	// 場合に応じた処理
	switch (number) {
		case 1:
			cout << "1が出ました\n";
			break;
		case 2:
			cout << "2が出ました\n";
			break;
		case 3:
			cout << "3が出ました\n";
			break;
		case 4:
			cout << "4が出ました\n";
			break;
		case 5:
			cout << "5が出ました\n";
			break;
		case 6:
			cout << "6が出ました\n";
			break;
		default:
			cout << "1,2,3,4,5,6どれかを入力してください\n";
	}

	return 0;

}
プログラムを実行して、さいころの出目を入力してみます。

実行結果1
サイコロの出目を入力してください:1
1が出ました
実行結果2
サイコロの出目を入力してください:3
3が出ました
実行結果3
サイコロの出目を入力してください:7
1,2,3,4,5,6どれかを入力してください

入力した値が式となり、その式の値が「1」だった場合は「1が出ました」と表示され、「3」だった場合は「3が出ました」と表示されます。

他もしかりです。

そして、1,2,3,4,5,6以外の値が入力されるとdefault処理が実行されます。

default処理はif文でいうelse文のような役割で、どの式の値にも当てはまらない場合の処理を書きます。

今回は「1,2,3,4,5,6どれかを入力してください」と表示する処理を書きました。

そして超重要なのが、「break;」です。

これがないとこうなります。

C++
#include <iostream>
using namespace std;

int main() {

	// 変数を宣言
	int number;

	// 値を入力
	cout << "サイコロの出目を入力してください:";
 	cin >> number;

	// 場合に応じた処理
	switch (number) {
	case 1:
		cout << "1が出ました\n";
	case 2:
		cout << "2が出ました\n";
	case 3:
		cout << "3が出ました\n";
	case 4:
		cout << "4が出ました\n";
	case 5:
		cout << "5が出ました\n";
	case 6:
		cout << "6が出ました\n";
	default:
		cout << "1,2,3,4,5,6どれかを入力してください\n";
	}

	return 0;

}
実行結果1
サイコロの出目を入力してください:1
1が出ました
2が出ました
3が出ました
4が出ました
5が出ました
6が出ました
1,2,3,4,5,6どれかを入力してください
実行結果2
サイコロの出目を入力してください:3
3が出ました
4が出ました
5が出ました
6が出ました
1,2,3,4,5,6どれかを入力してください

このように垂れ流し状態になるので「break;」は一つ一つに挟むおまじないであると思ってください。

もちろんこのような処理をしたい場合には使えますけどね!

場合に応じた処理のまとめと追加点

if文の構造
if(条件) {
	// 条件がtrueなら処理される
}
if-else文の構造
if(条件) {
	// 条件がtrueの場合の処理
}
else {
	// 条件がfalseの場合の処理
}
if-<else if>-else文の構造
if(条件1) {
	// 条件1がtrueの場合の処理
}
else if(条件2) {
	// 条件1がfalse→条件2がtrueの場合の処理
}
else if(条件3) {
	// 条件1,条件2がfalse→条件3がtrueの場合の処理
}
...
else {
	// 上記の条件に該当しない処理(else文省略可)
}
switch文の構造
switch(式) {
	case 式の値1:
		処理;
		break;
	case 式の値2;
		処理;
		break;
	case 式の値3;
		処理;
		break;
	...
	default:
		処理;
}

if-[else if]-else文の説明で以下のことを考えた方がいるかもしれません。

  • 90点以上はSランク
  • 80点以上90点未満はAランク
  • 70点以上80点未満はBランク
  • 60点以上70点未満はCランク
  • 60点未満はDランク

こうすればいいじゃないか!と。つまり、

C++
// 場合に応じた処理
if (score >= 90)               { cout << 'S'; } 
if (score >= 80 && score < 90) { cout << 'A'; } 
if (score >= 70 && score < 80) { cout << 'B'; } 
if (score >= 60 && score < 70) { cout << 'C'; } 
if (score >= 0  && score < 60) { cout << 'D'; }

こういうことです。しかしながら、これはプログラミングにおいてあまり良い書き方とは言えません。(もちろん可読性が上がるというとらえ方はできるが)

なぜなら90点以上の人はSランクであり、AランクやBランクかどうかは気にしなくていいからです。

つまり、無駄な比較の処理を行う可能性があるということです。

コンパイラで最適化してくれるかもしれませんが、期待はできません。