1. ホーム
  2. c

[解決済み】Switch文:defaultは最後のケースでなければならない?

2022-04-13 03:21:50

質問

以下について考えてみましょう。 switch ステートメントを使用します。

switch( value )
{
  case 1:
    return 1;
  default:
    value++;
    // fall-through
  case 2:
    return value * 2;
}

このコードはコンパイルできますが、C90/C99で有効(=定義された動作)なのでしょうか?私は デフォルト のケースは最後のケースではないのです。

EDITです。

として ジョン・ケイジ キリアンDS write: これは本当に醜くて分かりにくいコードで、それは十分承知しています。私はただ、一般的な構文(定義されているのか)と期待される出力に興味があるだけです。

どのように解決するのですか?

C99規格はこのことについて明示的ではありませんが、すべての事実を総合すると、完全に妥当なものです。

A casedefault ラベルは 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 整数プロモーションは、制御する の式で表されます。の定数式は 各ケースラベルは の昇格型である。 の式で表されます。変換された値が と一致する。 制御式は、制御がジャンプします。 の次のステートメントに移動します。 ケースラベルを使用する。そうでない場合、もし デフォルトのラベルにジャンプします。 というラベルの付いた文があります。変換されたものがない場合 ケース定数式にマッチし は、デフォルトのラベルがない場合、どの部分も は実行されない。