1. ホーム
  2. c

[解決済み】switch-caseの有効な、しかし無価値な構文?

2022-04-12 20:07:16

質問

ちょっとしたタイプミスで、偶然にもこの構成を見つけてしまいました。

int main(void) {
    char foo = 'c';

    switch(foo)
    {
        printf("Cant Touch This\n");   // This line is Unreachable

        case 'a': printf("A\n"); break;
        case 'b': printf("B\n"); break;
        case 'c': printf("C\n"); break;
        case 'd': printf("D\n"); break;
    }

    return 0;
}

のようです。 printf の上部にある switch ステートメントは有効ですが、完全に到達できないものでもあります。

到達不能コードの警告すら出ず、きれいにコンパイルできましたが、これでは意味がないように思います。

コンパイラはこれを到達不可能なコードとしてフラグを立てるべきでしょうか?

これは何か目的があるのでしょうか?

解決方法は?

おそらく、最も有用なものではありませんが、そうではありません。 完全に は無価値です。の中で利用可能なローカル変数を宣言するために使用することができます。 switch スコープを使用します。

switch (foo)
{
    int i;
case 0:
    i = 0;
    //....
case 1:
    i = 1;
    //....
}

標準の( N1579 6.8.4.2/7 ) には、次のようなサンプルがあります。

例 人工的なプログラムフラグメントの中で

switch (expr)
{
    int i = 4;
    f(i);
case 0:
    i = 17;
    /* falls through into default code */
default:
    printf("%d\n", i);
}

という識別子を持つオブジェクトは i は自動保存期間(ブロック内)で存在しますが、決して 初期化されるため、制御式がゼロ以外の値を持つ場合、その呼び出しは printf 関数は は不定値にアクセスする。同様に、関数 f に到達できない。

追伸 ちなみに、サンプルは有効なC++コードではありません。その場合、( N4140 6.7/3 , emphasis mine)。

ジャンプするプログラム 90 自動保存期間を持つ変数がスコープにないところから、スコープにないところまで スコープ内にある点は不正確である その変数がスカラー型でない限り を持つクラス型、些細なデフォルト コンストラクタとデストラクタ,これらの型の cv-qualifiedバージョン,あるいは 前の型 で、イニシャライザなしで宣言されている場合 (8.5).


90) の状態から移行すること。 switch ステートメントからケース・ラベルへの変換は、この点ではジャンプとみなされます。

そのため、以下のように置き換えます。 int i = 4;int i; は有効なC++になります。