12

私が維持しているいくつかのコードで、次のセクションを発見しました。

switch (m) {
    case 62: { // opening
        // some declarations
        // do some stuff
        break;
    case 63:
        // do some other stuff
        break;
        }      // closing
    default:
        // default stuff
        break;
 }   

ブロックの開始は、いくつかのローカル変数を宣言することを意図していますが、終了中かっこが間違って配置されており、. の後に発生していcase 63ます。

Visual Studio 2010 で問題なくコンパイルできるので、何ヶ月もこれに気付きませんでした。デバッグを試みたところ、どちらの場合も問題なく動作しました。

どうしてですか?これは正しい C 構文ですか?

4

3 に答える 3

16

ステートメントはcasegoto ラベルに似ているため、構文として使用できます。Duff のデバイスは有名な使用例です。

ただし、それを避けるようにしてください。

于 2013-01-28T20:40:12.970 に答える
5

6.8.1 ラベル付きステートメント、C99

ステートメントの前に、識別子をラベル名として宣言する接頭辞を付けることができます。ラベル自体は制御の流れを変更せず、ラベル全体で妨げられずに継続します。

つまり、中括弧は switch-case ラベルの動作には影響しませんが、単に新しいスコープを作成するだけです。

これは、見当違いの中括弧が構文エラーにならない理由を説明しています。

于 2013-01-28T20:45:29.410 に答える
4

驚くべきことに、これは言語標準に準拠した正しい構文です。これを行うこともできます:

switch (m) break;

またはこれ:

switch (m);

case const-expr:で使用する通常のラベルとほとんど同じように機能しますgoto

于 2013-01-28T20:43:26.227 に答える