13

コンパイラが break ステートメントを使用する必要がある理由を理解するのに苦労しています。フォールスルーが許容されるようになったので、見逃すことはできません。C または C++ で中断する理由はわかりますが、ここでは必要ですか。

ケースが終わった後に中断することが組み込みの動作ではないのはなぜですか? セマンティックのない単なる構文ではありませんか?

すみません、ばかげた質問でしたら。

編集: ケースが空の場合にのみ、落下が許可されます。そこにステートメントがある場合、break ステートメントは省略できません。だから、それは別の問題です。

4

4 に答える 4

10

コンパイラは break ステートメントをそれほど「必要」とはせず、要求します。

これは設計上の決定でした。これは、C 言語の常に議論の余地のある「機能」であったフォールスルーの落とし穴を排除しながら、コードを意味的に C および C++ に近づけます。

于 2010-03-02T13:16:27.910 に答える
3

C# の break ステートメントは、言語の作成者による設計上の決定でした...基本的に、彼らは「明確な」break ステートメント、つまり一方向にしか機能しない break ステートメントを望んでいました。要するに、彼らはフォールスルーを望んでいませんでした。「ブレーク」を含めずにフォールスルーを防止しただけでは、c++ との下位互換性が失われていたでしょう。

于 2010-03-02T13:15:18.540 に答える
2

ケース式が空の場合、フォールスルーが許可されます。

case Foo:  // fallthrough allowed.
case Bar:
    Console.WriteLine ("Foo or Bar");
    break; // required

許可されていないというのは、「if 条件で値を割り当てることはできない」と同じリーグでよくある誤解です*


*できます。ルールは、if 条件ではブール値のみが許可され、x=falsewithbool x; ブール値であるということだけです。

于 2012-01-31T09:20:30.997 に答える
0

通常、この種のコードはバグです。

// Contrived calculator demostration
decimal x = 5m;
decimal y = 10m;
decimal result = 0m;
string blah = "Divide";

// .. other code omitted

switch(blah) {
    case "Divide":
        result = x / y;

    case "Multiply":
        result = x * y;

    case "Add":
        result = x + y;

    case "Subtract":
        result = x - y;

    default:
        MessageBox.Show("Not a valid operation");

}

ただし、コンパイラは、欠落しているブレークがバグであると想定することはできません。それが知る限り、あなたは本当に事件が失敗することを望んでいました.

すべてのケースの最後にブレークが必要であると単純に仮定すると、1 つのバグを別のバグと交換することになります。

そのため、代わりに、言語設計者は空でないケースからのフォールスルーを許可せず、それらを省略するとエラーをスローします。

空でないケース間でコードを共有する必要がある場合は、それをprivate(おそらくstatic) メソッドに入れて、そこから呼び出します。

最後に 1 つ注意してください: 空のケースが失敗するのは、空のケースが期待されるすべてのことであり、それが許可されている理由です。

于 2010-03-02T15:15:10.573 に答える