[解決済み】switch-caseの有効な、しかし無価値な構文?
質問
ちょっとしたタイプミスで、偶然にもこの構成を見つけてしまいました。
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++になります。
関連
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] switch文の複数ケース
-
[解決済み】1つのswitch case文に2つの値を使用する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】strcmpが機能しない
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み] テスト
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】.axfファイルとは何ですか?