3

次のコードを見つけました。

switch(val){
    case 0:
        // some actions
       break;
    case 1:
        // some actions
       break;
    case 2:
        // some actions
       break;
}

val = 10しかし、例えば?の場合に何が起こるかは十分に明確ではありません。

このコードを短いプログラムで誤った値でテストしようとしましたが、何も起こらず、プログラムは正常に終了しました。

このコードは潜在的なエラーを引き起こす可能性がありますか? 何も起こらないという保証はありますか?

4

3 に答える 3

6

それは単に何もせず、いかなる場合にも入りません。

ステートメントdefaultの最後の句として句を使用することをお勧めします。switchのようなプログラムは、句Lintを忘れると警告します。また、参考までに、この句は で必須でdefaultあることに注意してください。defaultMISRA-C

編集:

個人的には最終節の方が好きですが、最も重要なのは最終節が存在することだと思います。私がそれを最後の節にすることを好む理由は、最小の驚きの原則によるものです。人々はそれを最後の節と見なすことに慣れているので、プログラムの読みやすさが向上すると思います。

そして、私が言及した情報とLintMISRA-Cの答えのためだけに、が存在するが最終節としてではなく、最終節として存在することを明示的に要求するPC-Lint / flexelint場合は警告しません。defaultMISRA-Cdefault

于 2013-03-17T15:29:20.163 に答える
1

そのため、デフォルトのケースが必要です。入力したもの以外のケースを処理します。

あなたのケースで何が起こるかというと、ケース 0 をチェックして一致せず、ケース 1 をチェックし、ケース 2 をチェックして再び一致しないということです。だからそれは終了します..

したがって、次のようにする必要があります。

switch(val){
    case 0:
        // some actions
       break;
    case 1:
        // some actions
       break;
    case 2:
        // some actions
       break;
    default:
       //some actions
       break;
}

注意すべきもう 1 つの小さな点: ケース 0 にする必要があります。ケース 0 ではありません。

于 2013-03-17T15:29:58.197 に答える
1

(この例では)から他の値を使用しても、0, 1, 2何も起こりません。 valケース内のすべての値と比較され、それらのいずれとも等しくない場合は、次のステートメントにジャンプします。

于 2013-03-17T15:30:41.747 に答える