なぜ言語はswitchステートメントで明示的なフォールスルーを使用しないのですか?


17

私は読んでいたなぜ私たちはで使用する必要breakがありswitchますか?、そして、明示的なフォールスルーのサポート(AFAIK)がないのに、一部の言語(PHPやJavaScriptなど)で暗黙的なフォールスルーが許可されている理由を疑問に思いました。

continue完全に適切であるように、新しいキーワードを作成する必要があり、著者が事件を解決することを意図していたかどうかのあいまいさの問題を解決するようなものではありません。

現在サポートされている形式は次のとおりです。

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ... //ambiguous, was break forgotten?
    case 3:
        ...
        break;
    default:
        ...
        break;
}

一方、次のように書くのは理にかなっています。

switch (s) {
    case 1:
        ...
        break;
    case 2:
        ...
        continue; //unambiguous, the author was explicit
    case 3:
        ...
        break;
    default:
        ...
        break;
}

この質問の目的上、フォールスルーが優れたコーディングスタイルであるかどうかの問題を無視できます。

フォールスルーを許可し、明示的にした言語が存在しますか?

switch明示的ではなく暗黙的なフォールスルーを可能にする歴史的な理由はありますか?


4
C#では、を明示的に指定する必要があるgoto caseため、質問の前提は少し間違っています。
pdr

1
@pdr、フォールスルーをすでにサポートしている言語があるかどうかを非常に明示的に尋ねましたがgoto case、C#には気づいていませんでした。
zzzzBov

ええ、ごめんなさい、私はあなたの質問に二つの部分があることを逃しました。あいにく、そのままの言葉で言いますが、投票の質問に非常に近いので、私は閉会を表明しています。多くの正解があります。
pdr

C#では、複数のラベルで同じステートメントリストを共有することもできます。これにより、フォールスルーが必要な状況の一部が削除されます。残りについてはgoto case、pdrが言及しているように、です。
ブライアン

回答:


20

これは主に歴史的なもので、ほとんどの言語はCが行ったことをコピーしただけです。

Cがそのようにした理由は、Cの作成者がswitchステートメントを簡単に最適化してジャンプテーブルにすることを意図したためです。これは、Cがswitchステートメントを整数値に制限する理由でもあります。

ジャンプテーブルでは、プログラムは式に基づいてジャンプする位置を計算します。プログラムはそのポイントにジャンプし、そのポイントから実行を続けます。テーブルの残りをスキップする場合は、テーブルの最後へのジャンプを含める必要があります。Cは、明示的なbreakステートメントを使用して、この構成要素に直接対応します。


7
ちょっとしたメモとして、彼の著書「エキスパートCプログラミング」で、ピーターヴァンデルリンデンは、CコンパイラでSunで働いている間、スイッチケースの約97%が含まれbreak、3%未満しかフォールスルーしなかったと述べています。。次に、これをデフォルトのフォールスルー動作が直観に反する例として使用し、逆にしたほうが良いだろう(明示的なフォールスルーを示すキーワードを使用する)。ああ、この本はCの他の奇妙な点を説明するのにも非常に優れており、その一部はC ++、さらにはC#やJavaにもあります!すべてBとBCPLに根ざしています。:)
zxcdw

3
c#(msdn.microsoft.com/en-us/library/06tc147t ( v=vs.71 ) .aspx)のように、フォールスルーが明示的なプログラミング言語があります。一方、ブレークはc#でも明示的です。
リンカーロ

@zxcdw:あまりにもの悪い少しバーディーが時間内に戻って、任意のラベルをマークすることを示唆している可能性が方法はありませんcase最初の以外は、自動的に接頭辞する必要がありますbreakが、マークされたもの+case(またはいくつかの他のそのような指示は)いけません。コンパイラーは、多くのコード行を排除しながら、現在の配置の意味上の利点を処理し、許可するのはコンパイラーにとって容易でした。
supercat

7

Goは、fallthroughキーワードを使用して明示的なフォールスルーを許可します(ブレークは暗黙的ですが、明示的である場合があります)。

switch val {
case 1: // breaks
case 2:
    fallthrough
case 3:
    goto 
case 4, 5, 6: // equivalent to defining individual cases with explicit fallthough
    break // unnecessary
default:
}

有効なgoおよび言語仕様からの関連ビットを以下に示します。

goto特定のケースに移動するために使用できるとは思いませんが、ケース内にラベルを作成してgoto通常のように使用できます。

ボーナスとして、Goでは、スイッチでバイナリ式、文字列、またはをcaseステートメントとして使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.