[解決済み】Switch文:defaultは最後のケースでなければならない?
質問
以下について考えてみましょう。
switch
ステートメントを使用します。
switch( value )
{
case 1:
return 1;
default:
value++;
// fall-through
case 2:
return value * 2;
}
このコードはコンパイルできますが、C90/C99で有効(=定義された動作)なのでしょうか?私は デフォルト のケースは最後のケースではないのです。
EDITです。
として
ジョン・ケイジ
と
キリアンDS
write: これは本当に醜くて分かりにくいコードで、それは十分承知しています。私はただ、一般的な構文(定義されているのか)と期待される出力に興味があるだけです。
どのように解決するのですか?
C99規格はこのことについて明示的ではありませんが、すべての事実を総合すると、完全に妥当なものです。
A
case
と
default
ラベルは
goto
ラベルを使用します。6.8.1 ラベル付きステートメントを参照してください。特に興味深いのは6.8.1.4で、すでに述べたDuffの工夫を可能にしています。
どのようなステートメントでも、その前に として識別子を宣言するプレフィックス ラベル名です。ラベルはそれ自体で 制御の流れを変えない。 を挟んで、何ら支障なく継続する。
編集
: スイッチ内のコードは特別なものではありません。
if
-ステートメントに、ジャンプラベルを追加したものです。これは、フォールスルー動作の説明と
break
が必要です。
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であるオブジェクトが存在する 自動保存期間 (ブロック内)ですが、決して 初期化されるため、もし 制御する式が0でない場合 の値がある場合、printf関数の呼び出しは は不定値にアクセスすることになる。 同様に、関数fの呼び出しは に到達できない。
switch文の中では、case定数は一意でなければなりません。
6.8.4.2.3 各ケースラベルの式は、整数の定数でなければならない。 式で、2つのケース の定数式は、同じ スイッチ文が同じであること 変換後の値。また スイッチのデフォルトラベルは最大1つまで ステートメントを使用します。
すべてのケースが評価され、その後、与えられた場合はデフォルトのラベルにジャンプします。
6.8.4.2.5 整数プロモーションは、制御する の式で表されます。の定数式は 各ケースラベルは の昇格型である。 の式で表されます。変換された値が と一致する。 制御式は、制御がジャンプします。 の次のステートメントに移動します。 ケースラベルを使用する。そうでない場合、もし デフォルトのラベルにジャンプします。 というラベルの付いた文があります。変換されたものがない場合 ケース定数式にマッチし は、デフォルトのラベルがない場合、どの部分も は実行されない。
関連
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み] switch文の複数ケース
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
C++の配列コピー
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] mallocで文字列を確保する
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] フリーは、どのように無料化を知っているのですか?