開発
switch文のfall-through
mima
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にエラーを出さなくなってる・・・)