Eyes, JAPAN Blog > switch文のfall-through

switch文のfall-through

mima

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

Haskell原理主義者の方はご存じないかも知れませんが、多くのC言語に影響を受けた言語はswitch文というものを持っています。
で、そのswitch文はfall-throughなる機能を持っています。

// a.cpp
#include
using namespace std;

int main()
{
switch(0)
{
case 0:
cout << 0 << endl; case 1: cout << 1 << endl; } return 0; } [/cpp] [bash] $ g++ a.cpp && ./a.out 0 1 [/bash] breakが無い限りswitchを抜けないという非常にアレな仕様なせいで、switchを使うたびにbreak忘れに気をつけないといけなくなります。 この問題に関して、D言語はうまく対処しています。 D言語では、上の例のようなcaseの中身がある場合の暗黙的なfall-throughを禁止しています。 fall-throughをして欲しい場合は、goto caseを使って明示的にfall-throughを指定する必要があります。 [cpp] import std.stdio; void main() { switch(0) { case 0: 0.writeln(); goto case; case 1: 1.writeln(); default:{} } } [/cpp] caseの中身がない場合は、暗黙的なfall-throughが許されます。 [cpp] import std.stdio; void main() { switch(0) { case 0: case 1: 0.writeln(); goto case; case 2: 2.writeln(); default:{} } } [/cpp] この仕様のおかげで、switchを使う際にbreakの書き忘れがあれば、コンパイル時に指摘してもらえます。 素晴らしいですね。   担当:美馬(けどなぜか最近のdmdは暗黙のfall-throughにエラーを出さなくなってる・・・)

Comments are closed.