2

機能していないコードを調べていると、switchステートメントから「ケース」を除外していることに気付きました。バギーコードは次の形式でした

switch (foo) {
   firstElem:
       ...
       break;
   secondElem:
       ...
       break;
}

ここでfirstElemsecondElemは列挙リストの一部です。switchコードをステップスルーすると、一致するものが見つからないため、閉じ括弧からジャンプします。

これは簡単に修正できましたが、コンパイル時も実行時もXCodeがまったく文句を言わなかったため、不安になりました。なんで?

  1. 言語の構造に、switch case解釈を難しくする何かがありますか?
  2. 他の動作(私は何も知りません)を生成するためにステートメントを省略したい場合がありますか?case
  3. これは他の言語でも起こりますか?Objective-Cは「Cの厳密なスーパーセット」であることを知っているので、Cでも同じことが起こる可能性があると思います(コンパイラによって異なります)。Javaはどうですか?C ++?

更新:私はXCode 4.4.1を使用しています(ただし、すぐにアップグレードします)。これは確立されたプロジェクトの一部です。**

さらなる更新と参照KevinBallardは、私が誤ってラベルを定義していたことを正しく指摘しました。ラベルとGOTOの詳細については、Cプログラミング言語3.8で、カーニハンとリッチーが次のように結論付けているディスカッションを見つけることができます(ただし、エラーチェックにある程度役立つ可能性があります)。

... gotoステートメントに依存するコードは、一般に、gotosを使用しないコードよりも理解および保守が困難です。私たちはこの問題について独断的ではありませんが、gotoステートメントが使用されることはほとんどないようです。

4

1 に答える 1

7

あなたが持っているのはあなたの中にある通常の古いラベルの束ですswitch。それは完全に合法です。case少し奇妙ですが、ステートメントのないスイッチは合法であるため、Xcodeは文句を言いません。

とはいえ、ステートメントのないステートメントclangを見ると警告が表示されます。GCCを使用していますか?switchcase

于 2012-08-29T19:30:33.793 に答える