1. 導入:switch文はなぜ「整数」しか扱えないのか?
C++を学習し始めると、条件分岐といえばif文が真っ先に思い浮かぶはずです。しかし、特定の変数に対していくつもの値で分岐させたい場合、if文を繰り返すとコードが読みづらくなります。そこで活躍するのがswitch文です。
しかし、switch文には「条件式に使える型は整数型か列挙型のみ」という独特の制約があります。なぜ文字列(std::stringなど)が使えないのか、その理由と正しい対処法を理解することで、より効率的でミスのないコードが書けるようになります。
2. 基礎知識:switch文の仕組み
switch文は、内部的には「ジャンプテーブル」という仕組みで最適化されることが多く、非常に高速な分岐が可能です。この高速性を維持するために、コンパイラは条件式が「離散的な数値(整数)」であることを求めています。
整数型とは、int, char, bool, longといった値が明確に区切れる型のことです。一方で、文字列は文字の並びであり、数値のように直接メモリ上のアドレスを計算して分岐先を決定することができないため、switch文の条件式には指定できません。
3. 実装/解決策:文字列を扱いたいときはどうする?
「文字列で分岐したい!」という場合は、switch文の代わりにif-else if文を使うのが一般的です。しかし、どうしてもswitch文に近い書き方をしたい場合は、列挙型(enum)を併用する方法があります。文字列を一度列挙型に変換することで、可読性を保ちつつswitch文を利用できるようになります。
4. サンプルプログラム
以下のコードは、整数を使った基本的なswitch文の例です。コピー&ペーストして動作を確認してみてください。
include <iostream>
int main() {
int mode = 2;
// switch文の条件式には整数型のみ使用可能
switch (mode) {
case 1:
std::cout << "モード1を選択しました。" << std::endl;
break;
case 2:
std::cout << "モード2を選択しました。" << std::endl;
// breakを忘れると下のcaseまで実行されるので注意!
break;
default:
// どのcaseにも当てはまらない場合の処理
std::cout << "無効なモードです。" << std::endl;
break;
}
return 0;
}
5. 応用・注意点:現場で役立つポイント
switch文を使用する際に初心者が最も陥りやすい罠は、break文の書き忘れです。breakがないと、合致したケース以降の処理がすべて実行されてしまう「フォールスルー」という現象が起きます。
また、もし条件式が文字列で、どうしても判定をスッキリさせたい場合は、C++17以降であれば「std::string_view」を使ってif文で判定するか、あるいは「std::unordered_map」を使って関数ポインタのテーブルを作成するなどの設計パターンが現場ではよく使われます。まずは基本の整数型でしっかり制御できる力をつけ、複雑な分岐が必要になったら別の方法を検討するようにしましょう。

コメント