default の位置

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

default の位置

投稿記事 by usao » 2年前

そういえば, switch の default って,これまで末尾にしか書いたことなかったなぁ…と.

例えば,case Y の処理をデフォルト(:case に書いてない XXX 値が来たときの動作)とするとき,こんな感じで書いてた:

CODE:

//default を case の並びの末尾に書くならば,こうなる
switch( XXX )
{
  case X: /*何か*/ break;
  case Z: /*何か*/ break;
  
  case Y: //fall through
  default : /* XXX==Y のときの処理 */ break;
}
これ,
XXX==Y のときの処理が case Y のとこに書いてないっていうのがもう不自然すぎて嫌な感じだし,
case の並び順が X→Y→Z ってなってる方が素直(:見やすい)っていう話だと,その点でも見難い.

何でこんな書き方をしていたのか?
「何かが頑なにそうさせていた」としか説明できないレベルで意味不明だが,その洗脳が突然解けたっていう感じ.

こんなもん,こう書けばいいじゃんね.

CODE:

switch( XXX )
{
  case X: /*何か*/ break;
  
  default: //fall through
  case Y: /* XXX==Y のときの処理 */ break;
  
  case Z: /*何か*/ break;
}
まったくなぁ…
最後に編集したユーザー usao on 2022年9月12日(月) 14:50 [ 編集 1 回目 ]

アバター
いわん
記事: 32
登録日時: 9年前

Re: default の位置

投稿記事 by いわん » 2年前

default はどの定数にも合致しない場合の処理ということで一番最後にあった方が自然な感じがするんでしょうね。
私も、そもそもどれでもない場合を標準の処理に当てはめるようなケース(ダジャレw)が殆どないので default は最後に書くようにしています。仕様にもよりますけど。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: default の位置

投稿記事 by usao » 2年前

default が先頭にあったらどうなんだろう? と想像すると,
「とりまデフォは○○なんだけど,Xの場合には△△で,Yの場合だと…」
っていう流れになって,何だかこれはこれで自然な気もしてくる.

でもこれだと,「多くの場合は○○で,XやYの側が特殊ケース」っていう雰囲気.
default が末尾だと default の側が「その他」って感じで特殊なケースっぽい.

どっちが特殊ケースなのか? によって default がどこに来ればしっくりくるのかが変わるのかな.
(で,多くの場合,それは末尾だという)
最後に編集したユーザー usao on 2022年9月13日(火) 09:56 [ 編集 1 回目 ]

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: default の位置

投稿記事 by usao » 2年前

switch 繋がりの話.
Xの場合とYの場合とでやること的にはほぼほぼ一緒なんだけどちょっとだけ違いがあるみたいなときに

CODE:

switch( XXX )
{
case X:  //fall through
case Y:
   ...
   ... ( XXX=X  ?  30   :   100 )  //←こんな感じのやつ
   ...
   break;
とかなったとき,なんか嫌,というか,もやもやする.

XXX の値で分岐してきた先でもう一回 XXX の値を判定するんかい!ってのが,なんだかなぁ,みたいな.
(関数化するほどの話でもないから case のとこに全部書きたいっていうとき)

アバター
いわん
記事: 32
登録日時: 9年前

Re: default の位置

投稿記事 by いわん » 2年前

switch文について、これってどうなんだろうな事がもう一つありました。
中で変数を宣言したとき、スコープが switch文内全体になってしまうところ。
しかも変数宣言時に初期化子が使用できない(-"-)
case 個別の処理で変数を宣言したい場合が多いので、{ }でくくったりしていますが・・・
なぜスコープが case 内だけにならないんだろう?

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: default の位置

投稿記事 by usao » 2年前

スコープ制限はブロック( {} で囲んだ範囲 )
みたいなイメージ(ルール?)に即したら,まぁそうなるのかな.

CODE:

switch( XXX )
{  //←これと
}  //←これでブロックになってるから
case 文は goto で使うラベルと同じような物,っていうような感じなんじゃないかな.
それ自身が何らかの「範囲」(≒ブロック)を作ってるわけじゃない,っていう.
(もしも case が「範囲」を作り出すならば,わざわざプログラマが末尾に break とか書かなくて済むハズ)

case 内に制限したい場合には(おっしゃるように) case のところにブロックをプログラマ自身で書けばそれで済むから,case だけにあえて特殊ルールを設ける必要性はない…ということかもしれない.

---

そこらへんのルールはともかくとして…
それじゃあ,「case 内に制限したくない場合」ってのはどんな状況だろうか?
switch ブロックがスコープであるローカルすぎる変数を複数の case に跨って便利に使いこなす状況ってのが思い浮かばないなぁ.

要は,こういう形だよね:

CODE:

switch( XXX )
{
	//変数定義.どこかの case 内に書こうが,ここに書こうが意味的には同じかと.
	int s;  //初期値を書けない

case 1:
	s = 2;	break; //s のスコープが switch であることに意味がある処理とは何か?
default:
	s = 10;	break;
}
//ここはもう s のスコープの外側だし
この s の使い道とは何か?
最後に編集したユーザー usao on 2022年9月16日(金) 10:15 [ 編集 1 回目 ]

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: default の位置

投稿記事 by usao » 2年前

例えばコレ↓なら
s には初期値を与えられるし,s を分岐処理の結果値として使えるよね.

CODE:

int main()
{
  ...
  
  {//sのスコープを制限するブロック
  
    int s = 77;
    switch( XXX )
    {
      //各 case で s をいじくるなりする
    }
    //この辺で s の値を使う
    
  }//sのスコープを制限するブロック
  
  ...
}
でも,switch 内に制限した形で書くとしたら,
「いやこれだと s のスコープが無駄に広すぎだろ」っていう状況だということだよなぁ… うーん.

アバター
いわん
記事: 32
登録日時: 9年前

Re: default の位置

投稿記事 by いわん » 2年前

usao さんが書きました:
2年前
case 文は goto で使うラベルと同じような物,っていうような感じなんじゃないかな.
確かにそんな感じですね。
フローチャートで処理の途中にがんがん矢印が割り込んでるのをイメージすると、
こういう仕様になるのもやむなしという気がしてきます。