問題の歴史:
swith演算子は、表現の値に応じて制御を複数のブランチに分配するためにC言語に導入されました。これは大規模なif-elseチェーンの代替であり、コマンド、状態、列挙値の処理に広く用いられています。
問題:
swith演算子の主な危険は、忘れられたbreakステートメント、予期しない「フォールスルー」、ブロック内に宣言された変数の複雑さ、および表現の型が整数でなければならないことです。
解決策:
安全に使用するためのポイント:
breakを使う(フォールスルーの必要性をコメントで明示すること);intまたはそれに互換性のある型以外を使用しない;caseで示されていないすべての値はdefaultブランチで処理する;case構造の外でのみ宣言するか、{}ブロック内に宣言する。コードの例:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("月曜日 "); break; case 2: printf("火曜日 "); break; case 3: printf("水曜日 "); break; case 4: printf("木曜日 "); break; case 5: printf("金曜日 "); break; case 6: case 7: printf("週末 "); break; default: printf("未知の日 "); } }
重要な特性:
breakなしで。switch文でfloat型を使用できますか?
いいえ。C言語の標準は、switchの式が整数であるか、整数にキャストされている必要があると要求します(char、short、int、long、enumなど)。
caseを入れ替えた場合、順序はロジックに影響しますか?
switch内のcaseの宣言の順序は、必要な値の検索には影響しません。コードは一致するcaseから最初のbreakまで実行されます。しかし、breakがない場合(フォールスルー)の場合は順序が影響します。
{}なしでcase内に変数を宣言できますか?
いいえ。追加のブロック{}なしでcaseの後に変数を宣言すると、コンパイルエラーが発生します。正しくは:
switch (x) { case 1: { int y = 0; break; } }
大規模プロジェクトで、プログラマーは一つのcaseの後にbreakを忘れ、複数のブランチが連続して実行されるエラーを引き起こしました。このバグはユーザーによってのみ発見されました。
利点:
欠点:
フォールスルーが必要な場合は、コメント付きのフォールスルーを使用し、すべての重要なcaseにはbreakまたはreturnを伴い、defaultには警告を出力しました。
利点:
欠点: