楽屋裏 - Else If
楽 屋 裏
e-Gadget
思い込みとは怖いものだ。
If文にまつわる話です。
これまで、Basic言語一般で使える記法 ElseIf が、CasioBasic には無いので、Else If は可読性が悪くなって使えないものとばかり思っていたのですが、思い込みだと言うことが分かりました。
Else If は結構使えます!
何のことかと言えば...
変数Eが、0、1、2、3 と異なる値になるとき、Eの値に応じて処理を切り替える...これは、Else If と言う記法を使えば、見やすいプログラムが書けるのですが、それが出来ないと思っていたばっかりに、確かめもせずに、If 文の入れ子構造が複雑になって使えず、不便だなぁ、と...
Else If の入力方法は、単に ELSE を入力し、続けて If を入力するだけです。
Else If を使えば、以下のように可読性を犠牲にせず、スッキリと書けます。
If E=3:Then
[処理3]
Else If E=2:Then
[処理2]
Else If E=1:Then
[処理1]
Else If E=0:Then
[処理0]
IfEnd
IfEnd
IfEnd
IfEnd
但し、If と同数の IfEnd を最後にまとめて書きます。
このように便利な Else If は使えないと思っていたので、Goto / Lbl を使って同じ構文を作って使っていました。Goto を使うのは出来れば避けたいところですが、正しく使えば役に立つ事例として、私は考えていました。
E=3⇒Goto 3
E=2⇒Goto 2
E=1⇒Goto 1
E=0⇒Goto 0
Goto Z
Lbl 3
[処理3]
Goto Z
Lbl 2
[処理2]
Goto Z
Lbl 1
[処理1]
Goto Z
Lbl 0
[処理0]
Goto Z
Lbl Z
一時の恥は一生の得 ということで、これからは Else If を必ず検討しようと思います。
懺悔にも近いこんなことを書いたのは、少し前 藤堂様 とのやりとりで、Goto は用法・用量を守って正しく使えば良い、と私の主張をし、その効用の1例として、上の複数条件分岐を例として挙げたのです。
それを、キチンと訂正したいと思ったので、別エントリーに書くことにしました。
藤堂様、失礼しました。
但し、一言だけ言い訳をしますと、
switch(E) {
case 3:
[処理3]
break;
case 2:
[処理2]
break;
case 1:
[処理1]
case 0:
[処理0]
}
といった、C言語の処理は、Else If では出来ないのです。
case 3: と case 2: では、break; がありますが、case1: と case 0: では break; が省略されています。
break; によって siwtch( )文を抜けます。
Eが3や2、そして0 の時は、それぞれ対応する処理を行います。
ところが、Eが1の時は [処理1] に続いて [処理0] を行います。[処理1] の後に break; が無いためです。
私が作った構文では、Goto Z が breark; に相当するので、C言語と同等の柔軟性がありますが、Else If の記法 にはそのような柔軟性が有りません。
このように break; を省略するのを fall through (フォールスルー) と言われます。個人的には柔軟性があって良いと感じていますが、プログラミングスタイルとしてフォールスルーを推奨しないことが多いと聞いています。break; が本来入るところを例外的に入れないと、他人がソースを見たとき、あるいは時間が経って身分でソースを見直すとき、必要なのに入れ忘れたのか、不要だから入れないのかが明確に分かりません。つまりバグの温床になるからです。
つまり、goto を使った複数条件分岐の記法は、フォールスルー処理ができる柔軟性に利点がある、という主張は危険な発想だと告白しておきます。
(言い訳終わり) (^^;)
...と言うことで、CasioBasicコマンドリファレンスの If 文 の項目も修正しました。
但し、Goto は用法・用量を守って正しく使いましょう! は撤回せずにおきます。
応援クリックをお願いします。励みになるので...