2024.02
林貴晴/AMSER Inc.
一般的に条件分岐にはif文が用いられますが、複数の条件を扱う場合、コードが複雑になりがちです。今回紹介するswitch文とcaseラベルの組み合わせを使うことで、複数の条件分岐を簡潔に記述することができます。
Switch - caseの基本形
switch (値) { case 定数1: // 処理1 break; case 定数2: // 処理2 break; // 他のcaseラベルを記述 default: // どのcaseにも一致しない場合の処理 break; }
値が定数1と同じ時 処理1が動作します。
breakを記述することで、処理2が動作しないようにします。
全ての定数と条件が合わなかった時にdefaultの処理が動作します。
※caseの定数には変数、関数は使用できません。
使用例
int value = 2; switch (value) { case 1: Print("Value is 1"); break; case 2: Print("Value is 2"); break; case 3: Print("Value is 3"); break; default: Print("Value is not 1, 2, or 3"); break; }
解説)この例では、valueが2であるため、"Value is 2"が出力されます。1、2、3以外の値の場合は、"Value is not 1, 2, or 3"が表示されます。
MQL5のswitch文では、意図的にbreak文を省略して複数のcaseを連続して実行させることができます。これにより、複数の条件で同じ処理を実行したい場合にコードをシンプルに保つことができます。
フォールスルーの例
int dayOfWeek = 5; // 週の日を表す数値(例:5は金曜日) switch(dayOfWeek) { case 1: // 月曜日 case 2: // 火曜日 case 3: // 水曜日 case 4: // 木曜日 case 5: // 金曜日 Print("平日です。"); break; case 6: // 土曜日 case 7: // 日曜日 Print("週末です。"); break; default: Print("無効な日です。"); break; }
この例では、月曜日から金曜日(1から5)までの場合、"平日です。"と出力し、土曜日と日曜日(6と7)では"週末です。"と出力します。フォールスルーを使用することで、同じメッセージを出力する複数のcaseに対して、コードの重複を避けることができます
switch文を使用すると、多くの条件分岐があるコードの可読性を向上させることができます。各caseは独立しているため、どの条件がどの結果につながるのかが明確になります。一方、if - else文は条件が増えるとネスト(入れ子構造)が深くなり、コードの追跡が難しくなることがあります。
switch文を使用する場合は、break文を忘れると予期せぬフォールスルーが発生するリスクがあります。これは、意図せずに次のcaseに処理が移行してしまうことを意味します。
switch文は比較する値が固定値に限られるため、変数や関数を利用する場合には、if - else文の方が柔軟に対応できます。
処理速度はswitch文がif文よりも速いとされますが、MQL5で行ったベンチマークテストでは両者の速度が非常に速く、実際の差を計測することができませんでした。
int colorCode = 2; switch (colorCode) { case 1: Print("赤"); break; case 2: Print("青"); break; case 3: Print("緑"); break; default: Print("未定義の色"); break; } |
int colorCode = 2; if (colorCode == 1) { Print("赤"); } else if (colorCode == 2) { Print("青"); } else if (colorCode == 3) { Print("緑"); } else { Print("未定義の色"); } |
switch文を活用することで、コードの可読性と効率性を高めることができます。特に多くの固定値に基づく条件分岐を扱う際には、その効果を最大限に発揮します。プログラミングにおいては、目的に応じて最適なコードを選択することが重要です。switch文は、コードを整理し、意図を明確に伝えることができます。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。