web-dev-qa-db-ja.com

Cすべてのケースの後のスイッチケース中括弧

C switch-caseフロー制御、変数がそのブロックで定義されている場合、caseの後に中括弧{}を配置する必要があります。

変数宣言に関係なく、すべてのcaseの後に中括弧を置くのは悪い習慣ですか?

例えば:

switch(i) {
  case 1: {
    int j = 4;
    ...code...
  } break;

  case 2: {  //No variable being declared! Brace OK?
    ...code...
  } break;
}
38
Ben

すべてのcaseブロックで中括弧を使用することは確かに無効ではなく、必ずしも悪いスタイルでもありません。変数宣言のためにブレース付きのケースブロックがある場合、他のブロックにブレースを追加すると、コーディングスタイルの一貫性が向上します。

そうは言っても、ストレートCのcaseブロック内で変数を宣言することは、おそらく良い考えではありません。コンパイラーによって許可されているかもしれませんが、おそらく、よりクリーンなソリューションがあります。相互に排他的なケースブロックは、いくつかの一般的な一時変数を共有できる場合があります。または、ケースブロックがヘルパー関数としてより適切に機能する場合があります。

38
bta

コンパイラがコードを最適化する方法のために、速度を犠牲にすることなく、すべてのcaseステートメントでブレースを使用できます。ですから、それはコーダーのスタイルと好みです。

  • 最も好ましい使用法は中括弧の使用ではありませんが、アクティブな開発中のすべてのケースでの括弧の使用は、コードに時々追加する方が簡単な場合があります。

  • それはただの美学です。 「case」ステートメントは単一のコマンドのみを必要とせず、ラベルとして機能するようにコードをウォークスルーするためです。したがって、ブロックは不要であり、無効ではありません。

  • 変数がある場合中括弧は、変数のコンテキストを作成するためだけに使用され、それらを使用することは大きな意味があります。異なるプラットフォーム上の一部のコンパイラは、含まれていない場合、異なる動作を示します。

10
SuperDuck

一般に、gotoまたはswitchを使用して、変数の初期化をジャンプするのは悪い習慣です。これは、caseごとのブロックがない場合に発生します。

C99には、初期化を飛び越えることが違法である、つまり可変長配列である場合もあります。 C++の非PODと同様に「構築」する必要があります。初期化は、後で変数にアクセスするために必要です。この場合、must blockステートメントを使用します。

5
Jens Gustedt

caseに中括弧を使用するのは悪いスタイルだと思います。ケースはgotoラベルに似たCのラベルです。また、現在のC言語では、新しいブロックを導入せずに各case(または好きな場所)で変数を宣言できますが、一部の人(自分自身も含む)もその悪いスタイルを考慮します。

1
R..

マイナーポイントを追加するだけで、多くのエディターとIDEでブロックの折りたたみおよび/または自動インデントが可能になり、複数のエディターと一致するブレースにジャンプできるようになります-ブレークからマッチングにジャンプできるものは私は個人的に知りませんケースステートメント。

他の人(または数か月後には自分の人)をデバッグまたはリファクタリングするとき、複雑なcaseステートメントを含むコードは、コードのセクションを折りたたむ機能と一致するケースにジャンプする機能の両方が非常に貴重です特にコードにインデントのバリエーションが含まれている場合

それは、ペストのような複雑なケースステートメントを避けることはほとんど常に良いアドバイスであると言いました。

0
Steve Barnes