標準 C では、switch 文内にある case のラベルに、ただ 1 つの値を関連付けることができます。Sun C では、case 範囲として知られる、一部のコンパイラに見られる拡張を許可しています。
case 範囲は、値範囲を指定し、個別の case のラベルに関連付けます。case 範囲の構文は、次のとおりです。
case low ... high:
case 範囲は、low ~ high で指定された範囲内にある各値に対して case ラベルを指定した場合とまったく同じ動作をします (low と high が等しい場合は、case 範囲はただ 1 つの値を指定します)。下限と上限の値は、C 規格の要件に準拠している必要があります。つまり、これらの値は、有効な整数型の定数式であることが必要です (C 規格 6.8.4.2)。case 範囲と case ラベルは、自由に混在することができ、単一の switch 文内で複数の case 範囲を指定できます。
プログラミングの例:
enum kind { alpha, number, white, other }; enum kind char_class(char c); { enum kind result; switch(c) { case 'a' ... 'z': case 'A' ... 'Z': result = alpha; break; case '0' ... '9': result = number; break; case ' ': case '\n': case '\t': case '\r': case '\v': result = white; break; default: result = other; break; } return result; } |
case ラベルに関する既存の要件に対してエラー条件を追加:
- low の値が high の値より大きい場合、コンパイラはエラーメッセージを生成してコードを拒否します (他のコンパイラの動作は一貫していないので、他のコンパイラでコンパイルした場合にプログラムが異なる方法で動作するわけではないことを保証する唯一の方法は、エラー状況を発生させることです)。
- ある case ラベルの値が、switch 文の中ですでに使用された case 範囲内の範囲に含まれている場合、コンパイラはエラーメッセージを生成してコードを拒否します。
- case 範囲どうしの範囲が重複している場合、コンパイラはエラーメッセージを生成してコードを拒否します。
case 範囲の終点 (上限または下限) が数値リテラルである場合、省略記号 (...) の前後に半角スペースを記述し、ピリオドのいずれかが小数点として扱われることを防止してください。
次に例を示します。
case 0...4; // error case 5 ... 9; // ok |