読み込み中...

C++のswitch文を完全に理解する6種類の実例付き解説

C++のswitch文を使用したプログラミングのイメージ C++
この記事は約15分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C++のプログラミング言語は、その強力な機能と柔軟性で知られています。

特に、そのコントロール構造の一つであるswitch文は、多くの場合でコードの可読性と効率を向上させる重要な要素です。

この記事では、C++のswitch文を初心者にもわかりやすく解説し、実例を交えてその使い方を紹介します。

プログラミングに新しく足を踏み入れた方々にも、この記事がC++とswitch文の理解の助けとなることを願っています。

●C++とswitch文の基本

C++は、多様なプログラミングスタイルをサポートする汎用的なプログラミング言語です。

オブジェクト指向プログラミング、ジェネリックプログラミング、手続き型プログラミングなど、多くのプログラミングパラダイムに対応しています。

C++は、そのパワフルな機能により、システムプログラミング、アプリケーション開発、ゲーム開発など幅広い分野で使用されています。

○C++とは何か?

C++は、C言語の拡張として開発され、より高度な機能を備えています。

例えば、クラスとオブジェクト、継承、多態性、テンプレートなど、オブジェクト指向プログラミングの概念をサポートしています。

これにより、コードの再利用性、保守性、スケーラビリティが向上し、より複雑なプログラムの開発が可能になります。

○switch文の基本構造

switch文は、特定の変数や式の値に基づいて、複数の分岐を行うために使用されます。

基本的な構造は下記の通りです。

switch (式) {
    case 値1:
        // 値1の場合に実行するコード
        break;
    case 値2:
        // 値2の場合に実行するコード
        break;
    ...
    default:
        // どのcaseにも該当しない場合に実行するコード
}

ここで、は評価される式や変数、値1値2は具体的な値を指します。

break文は、そのcaseを実行した後にswitch文から抜け出すために使われます。

default節は、どのcaseにも該当しない場合に実行されるオプションの節です。

○switch文とif文の比較

switch文とif文は両方とも条件に基づいてコードの実行を制御するために使われますが、それぞれに適した使用場面があります。

if文は、条件が複雑または動的な場合に適しています。

一方、switch文は、単一の変数や式の値に基づく単純な条件分岐に適しており、特に列挙型(enum)や整数型の値を扱う際に効果的です。

また、switch文の方がif-else if-else構造よりも読みやすく、理解しやすいことが多いです。

●switch文の基本的な使い方

C++でのプログラミングにおいて、switch文は複数の選択肢の中から一つを選ぶ際に非常に有用です。

この構文は特に、特定の値に応じて異なる処理を行いたい場合に役立ちます。

switch文の基本的な使い方を理解することで、より効率的かつ可読性の高いコードを書くことができるようになります。

switch文は、ある変数の値に応じて異なるコードブロックを実行するために使用されます。

この構文は、特定の値に対して個別の処理を行いたい場合に特に役立ちます。

例えば、ユーザーからの入力に応じて異なるメッセージを表示するプログラムなどが考えられます。

○サンプルコード1:単純な値の判定

ここでは、最も基本的な形のswitch文の使用例を紹介します。

特定の数値に応じて異なるメッセージを表示する簡単なプログラムをみてみましょう。

#include <iostream>
using namespace std;

int main() {
    int number;
    cout << "数値を入力してください(1〜3): ";
    cin >> number;

    switch (number) {
        case 1:
            cout << "入力された数値は1です。" << endl;
            break;
        case 2:
            cout << "入力された数値は2です。" << endl;
            break;
        case 3:
            cout << "入力された数値は3です。" << endl;
            break;
        default:
            cout << "1、2、3以外の数値が入力されました。" << endl;
    }

    return 0;
}

このコードでは、ユーザーに数値の入力を求め、入力された数値に応じて異なるメッセージを表示します。

switch (number)文はnumberの値を評価し、対応するcaseラベルのブロックを実行します。break文は、該当するcaseブロックの実行後にswitch文を終了させます。

もし入力された数値が1、2、3以外であれば、defaultケースが実行されます。

○サンプルコード2:複数のケースの扱い

次に、複数のケースを一つのブロックで扱う例を見てみましょう。

このテクニックは、複数の値に対して同じ処理を行いたい場合に便利です。

#include <iostream>
using namespace std;

int main() {
    char grade;
    cout << "評価を入力してください(A、B、C): ";
    cin >> grade;

    switch (grade) {
        case 'A':
        case 'B':
            cout << "非常に良いパフォーマンスです!" << endl;
            break;
        case 'C':
            cout << "もう少し頑張りましょう。" << endl;
            break;
        default:
            cout << "無効な評価です。" << endl;
    }

    return 0;
}

この例では、case 'A':case 'B':が同じブロックに属しています。

つまり、grade'A'または'B'の場合には、”非常に良いパフォーマンスです!”というメッセージが表示されます。

これは、複数の異なるケースに対して同じアクションを実行する効率的な方法です。

●switch文の応用例

C++のswitch文は基本的な使い方にとどまらず、様々な応用例が存在します。

これらの応用例を理解することで、より複雑なプログラミングの課題に対応できるようになります。

特に、列挙型(enum)の組み合わせや文字列の処理など、実践的な応用例はC++プログラミングの幅を大きく広げます。

○サンプルコード3:列挙型(enum)との組み合わせ

列挙型(enum)をswitch文と組み合わせることで、コードの可読性と保守性を高めることができます。

#include <iostream>
using namespace std;

enum Color { RED, GREEN, BLUE };

int main() {
    Color color = RED;

    switch (color) {
        case RED:
            cout << "赤色選択" << endl;
            break;
        case GREEN:
            cout << "緑色選択" << endl;
            break;
        case BLUE:
            cout << "青色選択" << endl;
            break;
        default:
            cout << "未知の色" << endl;
    }

    return 0;
}

このコードでは、Colorという列挙型を定義し、REDGREENBLUEという値を持たせています。

switch文では、これらの値に基づいて異なる処理を行います。

列挙型を使用することで、プログラム内での色の扱いをより明確にし、エラーの発生を防ぐことができます。

○サンプルコード4:文字列の処理(文字列処理ライブラリの使用)

C++では標準的に文字列をswitch文で直接扱うことはできませんが、文字列処理ライブラリを使用することで、間接的に文字列のswitch文処理を実現することが可能です。

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    map<string, int> colorMap;
    colorMap["red"] = 1;
    colorMap["green"] = 2;
    colorMap["blue"] = 3;

    string color;
    cout << "色を入力してください(red, green, blue): ";
    cin >> color;

    switch (colorMap[color]) {
        case 1:
            cout << "赤色選択" << endl;
            break;
        case 2:
            cout << "緑色選択" << endl;
            break;
        case 3:
            cout << "青色選択" << endl;
            break;
        default:
            cout << "未知の色" << endl;
    }

    return 0;
}

このコードでは、まずmapを使って文字列と整数値を対応付けます。

ユーザーからの入力(文字列)に基づいて対応する整数値を取得し、その値に基づいてswitch文で処理を行います。

この方法により、文字列に基づいた分岐処理を実装することができます。

●switch文の詳細な注意点

C++のswitch文を使用する際にはいくつかの重要な注意点があります。

これらの点を理解し適切に対応することで、コードのバグを防ぎ、より効率的で安全なプログラミングが可能になります。

特に重要なのは、break文の使用とdefaultケースの扱いです。

○break文の重要性

switch文内でcase節を使う際、それぞれのケースの終わりにbreak文を置くことが一般的です。

break文がない場合、プログラムは次のcase節にも進んでしまい、意図しない動作を引き起こす可能性があります。

#include <iostream>
using namespace std;

int main() {
    int number = 2;

    switch (number) {
        case 1:
            cout << "ケース1" << endl;
            // break文がないため、次のケースも実行される
        case 2:
            cout << "ケース2" << endl;
            break;
        case 3:
            cout << "ケース3" << endl;
            break;
        default:
            cout << "デフォルトケース" << endl;
    }

    return 0;
}

このコードでは、numberが2の場合にケース1ケース2の両方の出力が行われます。

これは、case 1:の後にbreak文がないためです。

通常、各case節の後にはbreak文を置くことで、そのケースの処理が終了したら直ちにswitch文を抜けるようにします。

○デフォルトケースの使用

switch文では、どのcaseにも該当しない場合の処理をdefault節で定義できます。これは、予期しない入力やエラー処理に役立ちます。

default節は任意ですが、全ての可能性をカバーするために使用することが推奨されます。

#include <iostream>
using namespace std;

int main() {
    int number = 5;

    switch (number) {
        case 1:
            cout << "ケース1" << endl;
            break;
        case 2:
            cout << "ケース2" << endl;
            break;
        case 3:
            cout << "ケース3" << endl;
            break;
        default:
            cout << "予期しない数値: " << number << endl;
    }

    return 0;
}

このコードでは、numberが1、2、3のいずれにも該当しない場合にdefault節が実行されます。

これにより、予期しない入力に対して適切な処理を行うことができます。

●switch文のカスタマイズ方法

C++のswitch文は柔軟性が高く、様々な方法でカスタマイズすることができます。

これにより、プログラムの特定のニーズに応じてswitch文をより効果的に使用することが可能になります。

特に、関数との組み合わせやswitch文内での変数宣言など、さまざまなカスタマイズ方法があります。

○サンプルコード5:関数との組み合わせ

関数をswitch文と組み合わせることで、コードの再利用性と整理が容易になります。

#include <iostream>
using namespace std;

void printMessage(int number) {
    switch (number) {
        case 1:
            cout << "ケース1のメッセージ" << endl;
            break;
        case 2:
            cout << "ケース2のメッセージ" << endl;
            break;
        default:
            cout << "デフォルトのメッセージ" << endl;
    }
}

int main() {
    printMessage(1);
    printMessage(2);
    printMessage(3);

    return 0;
}

このコードでは、printMessage関数内でswitch文を使用しています。

これにより、異なる数値に対するメッセージを効率的に処理することができます。

関数を使うことで、コードの再利用性が高まり、プログラムの構造も整理されます。

○サンプルコード6:switch文内での変数宣言

C++では、switch文内で新たな変数を宣言することも可能ですが、その際にはスコープに注意する必要があります。

#include <iostream>
using namespace std;

int main() {
    int number = 2;

    switch (number) {
        case 1: {
            // 新たなスコープ内で変数宣言
            int result = number * 2;
            cout << "ケース1の結果: " << result << endl;
            break;
        }
        case 2: {
            // 新たなスコープ内で変数宣言
            int result = number * 3;
            cout << "ケース2の結果: " << result << endl;
            break;
        }
        default:
            cout << "デフォルトケース" << endl;
    }

    return 0;
}

このコードでは、各case節で新たな変数resultを宣言しています。

switch文内で変数を宣言する場合、各case節を新たなスコープ(ブロック)として扱うことが重要です。

これにより、変数のスコープが限定され、他のcase節との間で変数の衝突を避けることができます。

まとめ

この記事では、C++のswitch文の基本から応用、詳細な注意点、カスタマイズ方法に至るまでを詳しく解説しました。

初心者から上級者までが理解しやすいように、実際のサンプルコードを交えながら、switch文の使い方を紹介しました。

これにより、読者はC++におけるswitch文の強力な機能とその柔軟な応用方法を完全に理解できるでしょう。

プログラミングの効率化とコードの可読性向上に役立つ知識が満載のこの記事が、読者のC++プログラミングスキル向上に貢献することを願っています。