Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

2.7 Switch 文内の Case 範囲

標準 C では、switch 文内にある case のラベルは、ただ 1 つの関連付けられた値を持つことができます。Solaris Studio C では、「case 範囲」として知られる、一部のコンパイラに見られる拡張を許可しています。

case 範囲は、値範囲を指定し、個別の case のラベルに関連付けます。case 範囲の構文は、次のとおりです。

case low ... high :

case 範囲は、low から high で指定された範囲内にある各値に対して case ラベルを指定した場合と同じ動作をします。(low high が等しい場合は、case 範囲はただ 1 つの値を指定します)。下限と上限の値は、C 規格の要件、具体的には、有効な整数型の定数式である必要があるという要件 (C 規格 6.8.4.2) に準拠している必要があります。case 範囲と case ラベルは、自由に混在することができ、1 つの switch 文内で複数の 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