2010-11-22 5 views
30

フロー制御では、変数がそのブロックで定義されている場合、中括弧{}の後に、caseの後に入力する必要があります。C各ケースの後でスイッチケースの中括弧

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

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

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

答えて

33

すべてのケースブロックで中カッコを使用することは間違いありませんが、必ずしも悪いスタイルではありません。変数の宣言のために中カッコで囲まれたいくつかの大文字小文字のブロックがある場合、他に中カッコを追加すると、コーディングスタイルをより一貫性のあるものにすることができます。

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

+2

ちょうど注 - 最初のケースの前にスイッチの始めに変数を宣言することができます(したがって、中括弧を追加することなくこれらの変数を共有できます)。 – martinkunev

8

ブレースは、コンパイラがコードを最適化する方法に起因する任意の速度ペナルティなしのすべてのcase文で使用することができます。つまり、コーダーのスタイルと好みだけです。

  • 活発に開発中のすべてのケースでは、それらの使用は、すべての今して、コードにいくつかの追加を行うことが容易に見出すことができるものの、最も好ましい使用量は、括弧を使用していません。

  • これは単なる東洋医学です。なぜなら、 'case'ステートメントは単一のコマンドだけでなく、ラベルとして機能するのでコード内を移動するからです。したがってブロックは必要なく、無効ではありません。

  • 'の場合は変数付きです。中括弧は大文字と小文字を区別せずに使用され、変数のコンテキストを作成します。異なるプラットフォーム上のコンパイラの中には、それらが含まれていないと異なる動作を示すものがあります。

+0

速度のペナルティがあるか、またはスタイルポイントに僅かな損失があるかどうか知っていますか? – Ben

+0

スピード違反はなく、あなたが持っていないようにコンパイルされます。私はこれを含める答えを編集しています。 – SuperDuck

+0

おかげでダック、残念なことに@ btaの解決策は私の混乱した頭で少し明確ですが、あなたの助けに+1。 – Ben

0

caseに中カッコを使用すると、悪いスタイルとみなされます。ケースはCのラベルで、gotoラベルに似ています。現在のC言語では、新しいブロックを導入することなく、各自の変数を宣言することができますが、自分自身も含めてその悪いスタイルを考慮しています。

+2

ブロックを区切らないと、 'case'で宣言した変数は次の変数で利用できます。あなたが大きなスイッチを持っているなら、それはいくつかの厄介なバグを作り出すかもしれません。ブロックを区切るか、関数呼び出しよりも少し減らす方が良いでしょう。 – Javier

+0

@Rと他の誰か - ああ - ブロックで変数を定義する実際の習慣は悪いことがありますか? – Ben

+0

@ Javier - 私のコンパイラの中には中括弧なしでクラッシュするものがあります。 「次のもので利用できる」とは思われません。 – Ben

5

一般的に、変数の初期化には、gotoまたはswitchを使用することをお勧めします。これは、ブロックがcaseにない場合に発生します。

初期化を飛び越すジャンプが不当なC99でも、可変長配列があります。 C++では非PODと同様に "構築"されなければならず、その初期化は後で変数にアクセスするために必要です。この場合、ブロックステートメントを使用する必要があります。

+0

+1なぜ 'スイッチ 'でvarを初期化するのが悪いのですか?考えてくれてありがとう。 – Ben

0

マイナーポイントを追加するだけで多数のエディタを追加する& IDEでブロックを折りたたんだり、自動インデントしたりすることができます。いくつかのブレースでは、ブレースにジャンプすることができます。一致するcase文に壊れます。

複雑なケースステートメントを含むコードでは、コードのセクションを折りたたむことと一致するケースにジャンプする能力が非常に重要です。 特にコードに字下げの変形が含まれている場合

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