switch文のdefault-caseイディオム


switch文の条件式がいずれのケースにも当てはまらない場合、以下のコードではdefault:の次に位置するcase文case ControlSize_M:が実行されます。

double ControlSizeOf(ControlSize size) {
   switch (size) {
      case ControlSize_S: return 1;
      default:
      case ControlSize_M: return 2;
      case ControlSize_L: return 3;
   }
}

ControlSizeOf(ControlSize_S); // 1
ControlSizeOf(ControlSize_M); // 2
ControlSizeOf(ControlSize_L); // 3
ControlSizeOf(-1); // 2

本来、defaultの直後に書くべきreturn文やbreak文を省略している所がミソです。

switch文にはbreak文省略時、次に書かれたcase文が暗黙的に呼ばれるという仕様があり、今回はそれを応用しています。

本来default: return 2; case ControlSize_M: return 2;と書く所をdefault: case ControlSize_M: return 2;と書くことが出来ますので、冗長なコードが避けられ、保守性も向上するというメリットがあります。

フォールスルー(fall through)

ちなみにswitch文のこの仕様はフォールスルー(fall through)と呼ばれています。当然defaultラベルだけでなく、caseラベル内でも有効な仕様ですので、以下の様なテクニックとして応用も可能です。

switch (operator) {
	case '+': case '-': case '*': case '/':  return "四則演算です";
	case ',': case '|': return "区切り文字です";
	case '(': case ')': return "カッコです";
	default: case '\0': return "(未定義)";
}

広告

switch文のdefault-caseイディオム」への1件のフィードバック

  1. ピンバック: switch文のブレース省略イディオム【波括弧省略の意外なテクニック】 | MaryCore

コメントは停止中です。