3

将来の読者と後で私自身の正気のために、ケースがないステートメント(すべてのケースがカバーされているため)または何もしないはずの最後のelseが続くswitchステートメントを省略してはならないことを絶対に明確にしたいですそして、その趣旨のコメントが含まれています(例を参照)。defaultif-elseif-else

ただし、ステートメントにdefaultケースを含めswitchて空のままにしておくと、ケース内にセミコロンを入れる必要があります。そうしdefaultないと、コンパイラエラーが発生します。'}'"が発生する前。どうして?!

例:コンパイラエラーを生成します

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */
}

例:コンパイラエラーを生成しません

switch(direction) {
    case MOVE_UP:
    //...
    break;
    case MOVE_RIGHT:
    //...
    break;
    case MOVE_DOWN:
    //...
    break;
    case MOVE_LEFT:
    //...
    break;
    default:
        /* DO NOTHING */;
}
4

2 に答える 2

12

あなたのdefaultケースのステートメントが必要だからです。セミコロンは空のステートメントです。

于 2012-05-21T18:11:49.817 に答える
9

C++03の6.1/1は、ラベル付きステートメントの文法を示しています。

ラベル付きステートメント識別子ステートメント
    ケース定数式ステートメント
    デフォルト:ステートメント

C ++ 11は、ラベルの前に属性を持つことができることを除いて同じです。

トークンの長さがゼロのシーケンスはC++のステートメントdefault:ではないため、それ自体はラベル付きステートメントではありません。

とはいえ、ラベル付きステートメントの文法で許可されていない理由が何であるかはわかりません。もしそうなら、あなたが書いた場合、そのステートメントがに属するかどうか、またはそれ自身のステートメントがないがすぐ後に続くかどうか、文法的な曖昧さがあります。それが何を意味するのかはまだ間違いありませんが、おそらくそれは人々のパーサーを台無しにするだろうと考えられていました。default: statementoptdefault : case 1: break;case 1: break;default:default:

于 2012-05-21T18:20:57.250 に答える