Programming組込みCプログラマー

C言語における'switch'演算子の動作について説明してください。その適用が適切な状況、存在する制限、および隠れた罠や移植性について知っておくべきことは何ですか?

Hintsage AIアシスタントで面接を突破

回答。

問題の歴史:

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("未知の日 "); } }

重要な特性:

  • ケースターゲットは一意である必要があります。
  • 値は定数でなければならず、通常はリテラルまたは列挙型です。
  • 1つのケースから別のケースへの「フォールスルー」は自動的に発生します。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を忘れることにより、余計な副作用を引き起こす。
  • defaultを使用しないことでサポートが難しくなる。
  • {}ブロックなしでcaseラベルの後に変数を宣言する。
  • コンパイル時定数でない値を使用する。

実生活の例

ネガティブケース

大規模プロジェクトで、プログラマーは一つのcaseの後にbreakを忘れ、複数のブランチが連続して実行されるエラーを引き起こしました。このバグはユーザーによってのみ発見されました。

利点:

  • コードが少なく、書くのが速い。

欠点:

  • ロジックが崩れ、ユーザーは不正確な結果を得たため、デバッグに時間がかかる。

ポジティブケース

フォールスルーが必要な場合は、コメント付きのフォールスルーを使用し、すべての重要なcaseにはbreakまたはreturnを伴い、defaultには警告を出力しました。

利点:

  • コードが読みやすく、バグが少なくなる。
  • 挙動が各読み手にとって透明である。

欠点:

  • 各ブランチの維持には注意が必要である。