switch文のブレース省略イディオム【波括弧省略の意外なテクニック】

switch文はenumとの組み合わせで使うことがほとんどだと思いますが、実は一般的な値の比較処理でも便利に使えます。これは意外と知られていない記法なのですが、非常にメリットも多いと感じてます。

int value = 3;

// Before
if (value == 3 || value == 5)
   puts("3 or 5");

// After
switch (value) case 3: case 5:
   puts("3 or 5");

// case側にブレースを付けると基本文法っぽくなる
switch (value) case 3: case 5: {
   puts("3 or 5");
}

switch文のブレース(波括弧{})省略とcase文のフォールスルー(fall through)というテクニックを応用しています。

慣れると意外とわかり易い記法で、目的や意味も明確になるため、とても気に入っています。

また、コンパイラによってはswitch文の特殊な範囲記法('0'...'9')も活用できるため、複雑な処理をより簡潔に記述することも可能になります。

const char ch = '3';

// Before
if (ch >= '0' && ch <= '9') {
    puts("This is digit");
}

// After
switch (ch) case '0'...'9': {
   puts("This is digit");
}

// Cool
switch (ch) case 'a'...'z': case 'A'...'Z': {
   puts("This is alpha");
}

case文側にブレースを付けてより基本文法っぽくしてみました。

メリット

また、このイディオムの利点は一時変数の記述を省略出来ることです。

// これだとgetValue()が二回呼ばれる
// 無駄な処理になってしまうので
if (getValue() == 3 || getValue() == 5) puts("3 or 5");

// 一時変数に格納してから比較することが多い
int value = getValue();
if (value == 3 || value == 5) puts("3 or 5");

// しかし、こうすれば同等でより簡潔な記法になる
switch (getValue()) case 3: case 5: puts("3 or 5");
広告
広告