以前に
『分岐処理とは?』のところで登場した
「switch文」を覚えているでしょうか。
「switch文」は
多分岐処理を記述する際に、
if文よりも
ソースコードの読みやすさと実行速度に
優れている、
というお話をしました。
しかし、
この「switch文」には
危険な使い方があるのです。
「switch文」の書式
「switch文」の一般的な書式は、
以下のようになります:
case i:
条件式がiのときの処理
break;
case j:
条件式がjのときの処理
break;
...
default:
条件式が上記以外のときの処理
break;
}
※i, jは異なる整数
具体的には、
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を省略とは
どういうことでしょうか。
例えば、
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を省略できるのです。
危険なフォールスルー
さて、先ほどのフォールスルーの例は、
あまり危険ではありません。
(逆に直感的で読みやすい)
しかし、以下のような例では
どうでしょうか。
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を記述し忘れたのか、
区別がつきにくくなります。
基本的には意図的ではない
(記述し忘れによる)
『フォールスルー』は
バグとなってしまいます。
このような
危険なフォールスルー対策として、
「C#」というプログラミング言語では、
フォールスルーを記述できないように
なっています。
そのため、switch文を使う際には、
極力フォールスルーは使わないように
心掛けてください。
■PS
こちらでの記事を更新しはじめました。下記の記事は人気です。
フリーテキストエディタ11選