45301


今日のリアル Q&A から

`switch` に対する `default` が最初に記述されているソースコードを見かけました。どのように動くのでしょうか？

[code]

    void func(int setting) {
        switch (setting) {
        default:
        case 0:
            foo();
            break;
        case 1:
            bar();
            break;
        case 2:
            baz();
            break;
        }
    }
    
[/code]

また、このような記述をして何がうれしいんでしょうか？すごく違和感を感じます（馬から落馬）


CC BY-SA 4.0
2018-07-04T05:22:47.163
45300
2018-07-04T12:19:56.653
8589
question
c++ c
switch で default を最初に記述すると


C/C++ において `default` は「全ての `case`
に合致しないとき」です。ソースコード上に記述されている順番は関係ありません。提示例においては `0` `1` `2` 以外のとき `default`
に処理が移ります。結局のところ

  * 1 のとき `bar()`
  * 2 のとき `baz()`
  * それ以外の全ての値 (0 を含む) `foo()`

何がうれしいのかはバグ対策と言うか、設定ミスに対する安全性の確保です。

提示例 `setting` がプログラムの外から来る設定値だとします（設定ファイルに記述できたり、基板上の EEPROM
等に書き込める値とします）。なので範囲外の値が来ることは事前に予想できているものとします。そして `0` が標準設定の動作で `1` `2`
は設定変更できる範囲内の動作としましょう。

現プログラムは `0` `1` `2` 以外には対応していないので、設定値 `-1` や `3`
に対してどう動作すればよいかは仕様次第なのですが、その仕様として、範囲外のときは標準動作をするものとしておきます（組み込み系では、まったく動作しないよりは標準動作するほうが１００倍マシ）。そういう仕様であると知っている人がこのソースコードを見るとき

  * 設定範囲外の値が来たとき `default` に到達する
  * その処理は明記されている `0` のときと同じ、つまり 
    * `0` が標準設定であることがソース上明記されている
    * `default` の動作が標準設定時の動作と同じ動作であることがソース上明記されている
  * 最初に `default` を必ず書く習慣づけすることで、書き忘れというケアレスミスを防止できる

という内容が半自動で担保されます。ソースコード上の記述が微妙に不自然なのは否めませんが。


CC BY-SA 4.0
2018-07-04T05:22:47.163
45301
2018-07-04T11:36:56.793
2018-07-04T11:36:56.793
8589
8589
45300
answer


時々、書くことがあります。

1,2 以外は、default なんですが、 0もdefaultもdefaut扱いなんだって明示したいときに。

コメントでも良いのですが、 まあ、書いた方が明確かと。


CC BY-SA 4.0
2018-07-04T12:19:56.653
45311
2018-07-04T12:19:56.653
45300
answer