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");