16

サードパーティの C コードを確認すると、次のようなものに出会いました。

switch (state) {
case 0: 
    if (c=='A') { // open brace
        // code...
    break; // brace not closed!
case 1:
    // code...
    break;
    } // close brace!
case 2:
    // code...
    break;
}

私がレビューしていたコードは単なるタイプミスのように見えましたが、エラーなしでコンパイルされたことに驚きました。

なぜこれは有効な C なのですか?
予想される場所でブレースを閉じる場合と比較して、このコードの実行にどのような影響がありますか?
これが役に立つ場合はありますか?

編集:例では、すべてのブレークが存在することを確認しました(上記のように)-ただし、ケース0または1でブレークがない場合の動作も回答に含まれる可能性があります。

4

2 に答える 2

14
于 2013-06-19T13:20:36.357 に答える
3

C および C++ では、変数宣言を飛び越えない限り、ループおよび if ブロックにジャンプすることは合法です。を使用した例についてこの回答を確認できますが、同じアイデアがブロックgotoに適用されない理由がわかりません。switch

}ご想像のとおり、上記の場合とはセマンティクスが異なりcase 1ます。このコードは、ステートメントの右中括弧がある場所であるため、
実際には ifstate == 0c != 'A'then go to を示しています。次に、そのコードを処理し、コードの最後のステートメントにヒットします。case 2ifbreakcase 2

于 2013-06-19T13:22:48.967 に答える