1

私の友人のコードを閲覧している間、私はこれに気付くようになりました:

switch(State &state = getState()) {
case Begin: state = Search; break;
// other stuff similar
}

スイッチヘッダーの変数とは何ですか?彼はGCCを使用しているので、これはGCC拡張機能である可能性があります。何か案が?

4

1 に答える 1

9

これは秘密でもGCC拡張でもありません。if変数は、s、whiles、switchesなどの条件で宣言できます。例えば:

while (char c = cin.get()) { ... }

また

if (int* something = (int*)malloc(4)) { // but don't use malloc in C++
    // ...
}

それらが初期化されたと宣言された後、それらはbool値に変換され、それらがブロックに評価される場合trueは実行され、それ以外の場合はブロックがスキップされます。それらのスコープは、それらが宣言されている条件を持つ構成のスコープです(そして、の場合if、スコープはすべてのelse ifおよびelseブロックにも適用されます)。

C ++ 03規格の§6.4.1では、

選択ステートメントは、いくつかの制御フローの1つを選択します。

selection-statement:

    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condition ) statement

condition:

    expression
    type-specifier-seq declarator = assignment-expression

ご覧のとおり、またはtype-specifier-seq declarator = assignment-expressionの条件で許可されます。そして、あなたは「繰り返し構造」のセクションで似たようなものを見つけるでしょう。ifswitch

また、switchesは、積分または型に暗黙的に変換できるクラスの積分またはenumまたはenumインスタンスで機能します(§6.4.4)。

switchステートメントで初期化された宣言である条件の値は、整数型または列挙型の場合は宣言された変数の値、それ以外の場合は暗黙的に整数型または列挙型に変換された変数の値です。

私は実際に、「C++の隠された機能」の質問に投稿した回答からこれを知りました。だから私はあなたにそれを思い出させることができてうれしいです:)

于 2012-04-28T17:36:31.820 に答える