[解決済み] switch文はなぜブレークが必要な設計になっているのでしょうか?
質問
単純なswitch文がある場合
switch (int)
{
case 1 :
{
printf("1\n");
break;
}
case 2 :
{
printf("2\n");
}
case 3 :
{
printf("3\n");
}
}
ケース2でbreak文がないのは、ケース3のコードの中で実行が継続されることを意味します。 これは偶然ではなく、そのように設計されているのです。なぜこのような決定がなされたのでしょうか?ブロックに自動的なブレークセマンティックを持たせた場合と比較して、どのような利点があるのでしょうか?その根拠は何ですか?
解決方法は?
として、落ち切りに着目した回答が多いようです。
理由
を必要とするのは
break
ステートメントを使用します。
C言語が設計された当時は、これらの構成要素がどのように使用されるかについての経験がほとんどなかったため、単純にミスだったと考えています。
ピーター・ヴァン・デル・リンデンは、彼の著書「エキスパートCプログラミング」の中で、このことを述べています。
<ブロッククオートSun Cコンパイラのソースを解析したところ デフォルトのフォールディングの頻度を確認するために が使用されていました。 Sun ANSI C コンパイラのフロントエンドには244個のスイッチ ステートメントがあり、それぞれのステートメントには 平均7件 フォールスルー が発生するのは、全体の3%に過ぎない。
つまり、通常のスイッチ の動作は 誤 97%の確率で。 コンパイラに限ったことではありません - それどころか 逆にフォールスルーが使われているところでは この分析では、多くの場合 より頻繁に発生する状況 他のソフトウェアに比べ、コンパイラで 例えば、演算子をコンパイルする場合 1個または2個を持つことができる のオペランドを指定します。
switch (operator->num_of_operands) {
case 2: process_operand( operator->operand_2);
/* FALLTHRU */
case 1: process_operand( operator->operand_1);
break;
}
ケースフォールスルーは非常に広く普及している 不具合として認識されているため という特別なコメント規約があるほどです。 上図のように、lint に "これは 本当に3%のケースのうちの1つで が望ましいとされています。
C#では、各ケースブロックの最後に明示的なジャンプ文が必要なのは良いアイデアだったと思います(ただし、複数のケースラベルを重ねることは可能です - 文のブロックが1つである限りは)。C#では、あるケースから別のケースにフォールスルーさせることは可能ですが、次のケースにジャンプするために
goto
.
Javaがこの機会にCのセマンティクスから脱却できなかったのは残念です。
関連
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
-
[解決済み] なぜ、(j++);という記述が禁じられたのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
ポインタ定数および定数ポインタ
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
[解決済み] mallocで文字列を確保する
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?