switch文の危険な使い方

  • このエントリーをはてなブックマークに追加
  • Pocket

以前に
『分岐処理とは?』のところで登場した
「switch文」を覚えているでしょうか。

「switch文」は
多分岐処理を記述する際に、

if文よりも
ソースコードの読みやすさと実行速度に
優れている、

というお話をしました。

しかし、
この「switch文」には
危険な使い方があるのです。

「switch文」の書式

「switch文」の一般的な書式は、
以下のようになります:

switch (条件式) {
case i:
条件式がiのときの処理
 break;
case j:
条件式がjのときの処理
 break;
...
default:
 条件式が上記以外のときの処理
 break;
}

※i, jは異なる整数

具体的には、

int value = x; ...①

switch (value) {
case 0:
System.out.println("0");
break;
case 1:
System.out.println("2");
break;
default:
System.out.println("-1");
break;
}

上記の場合、

①のxが0なら
0
と出力され、

①のxが1なら
1
と出力され、

①のxが0と1以外なら
-1
と出力されます。

「switch文」では、
このような書き方が一般的なのですが、
『フォールスルー』という特殊な書き方も
存在します。

フォールスルー
(fall through)

『フォールスルー』とは、
switch文において、breakを省略した
書き方のことです。

breakを省略とは
どういうことでしょうか。

例えば、

int value = x; ...②

switch (value) {
case 0:
case 1:
System.out.println("0or1");
break;
default:
System.out.println("-1");
break;
}

上記の場合、

②のxが0か1なら
0or1
と出力され、

②のxが0と1以外なら
-1
と出力されます。

このようにswitch文では、
case文にbreakを記述することは
強制ではないのです。

breakは、次のcase文の処理を
実行させたくない場合に記述します。

そのため、
もし次のcase文の処理を
続けて実行したいときには、
breakを省略できるのです。

危険なフォールスルー

さて、先ほどのフォールスルーの例は、
あまり危険ではありません。
(逆に直感的で読みやすい)

しかし、以下のような例では
どうでしょうか。

int value = x; ...③

switch (value) {
case 0:
System.out.println("0");
case 1:
System.out.println("1");
break;
default:
System.out.println("-1");
break;
}

上記の場合、

③のxが0なら
0
1
と出力され、

③のxが1なら
1
と出力され、

③のxが0と1以外なら
-1
と出力されます。

このようなフォールスルーは、
処理が複雑になりやすく、

さらに、
ソースコードを見たときに、
意図的にbreakを記述しなかったのか、
単にbreakを記述し忘れたのか、
区別がつきにくくなります。

基本的には意図的ではない
(記述し忘れによる)
『フォールスルー』は
バグとなってしまいます。

kohsaka

このような
危険なフォールスルー対策として、
「C#」というプログラミング言語では、
フォールスルーを記述できないように
なっています。

そのため、switch文を使う際には、
極力フォールスルーは使わないように
心掛けてください。

■PS

こちらでの記事を更新しはじめました。下記の記事は人気です。
フリーテキストエディタ11選

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できます。

SNSでもご購読できます。

コメントを残す

*

未経験からの育成制度も充実
IT講師に興味はありませんか?

リカレントテクノロジーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する