#11 条件式 (もしも…だったら)

ifとelse

人生は判断の連続です。 そして、その判断は「もし○○だったら」というのが基本でしょう。

例えば、「もし僕がヒーローだったら」

あるいは、「もしお財布に2万円以上入っていたら」

プログラミングでは、「もし○○であればA、そうでなければB」のように処理を進めていきます。 これによって一本道ではない、操作や状態に応じたプログラムを書くことができます。

基本的な書式は次のようなものです。

Rubyだと次のようになっています。

elseはifの条件を満たさない場合に実行される部分です。 「さもなくば」と表現されることが多いです。

ifの条件を満たさない場合にさらに条件の判定を続けたい、「そうでなく、もし〜であれば」という条件を書きたい場合は専用の書き方が用意されている場合が多くなっています。

PerlやRubyではelsifを使います。

sh, bash, zshなどではelifを使います。 これらのシェルスクリプトではifの終了もfiとなっています。

JavaScriptにはelsifelifがありません。 ただしJavaScriptの場合、ifelseのあとブロックなしならば続く一文がぶら下がっているコードだと理解されますから、else ifと書くことができます。

多くの言語にはifとは逆に条件式がの場合に実行されるunlessがあります。 ただし、elsunlessはないのが普通です。unlessによって明らかにわかりやすくなる場合を除けばあまり好まれません。

数学の世界ではおおよそ「成り立つものが、成り立たないものが」ですが、プログラミングの世界だともうちょっと広い言葉です。

数学的に考えてもわかりやすいのは次のようなものでしょう。

式の戻り値をすべて表示してくれる対話的Rubyシェルであるirbを使うと次のようになります。

% irb
irb(main):001:0> x = 10
=> 10
irb(main):002:0> x > 5
=> true

true()が返っていることがわかります。

しかし、プログラミング言語上でのは次のように認識されます。

x > 5のような比較条件式は多くの言語で論理値を返します。 しかし、モダンな言語では論理値以外もをはかることができるのが一般的です。

言語
Perl になるもの以外 数値0(浮動小数点数を含む), 空文字列"", undef
Ruby になるもの以外 false, nil
Python になるもの以外 数値0, 空文字列"", 空のタプル(), 空のリスト[], 空のディクショナリ{}, False, None
JavaScript になるもの以外 数値+0/-0/NaN, 空文字列"", false, null, undefined
PHP になるもの以外 数値0, 浮動小数点数値0.0, NaN, 空文字列"", 文字列"0", 空配列[], NULL, FLASE, SimpleXMLの空タグオブジェクト
Java true false
C 数値0以外 数値0(NULL0の別名)
Lua になるもの以外 false, null

言語ごとに値が異なることを理由に、あるいはJavaから入ったために条件式に必ず比較演算子を書くような人もいるのですが、 非常にマナーが悪く、読みづらく、保守もしづらいのでやめましょう

例えばRubyでは失敗した場合は通常、nilを返します。 nilとして扱われます。次のコードでは抽象化された入力ARGFから一行ずつ読みます。 入力が終了するとARGF.getsnilを返します。 whileは条件式がの間ループするものです。

これをわざわざnilかどうか判定するのは明らかに余計です。 一気にわかりづらくなりました。

また、JavaScriptでは空の値nullと未定義を示すundefinedは異なる値です。 しかしいずれにしても値がないことには変わりありません。 「値が定義されている可能性もあるのだけど、定義されてなかったら定義する」ということを示すならば

で良いのですが、これを比較演算子で表現しようとすると

くらいは書かないといけません。 これは多分、このコードを見た誰かが発狂します。

あなたのお気に入りの言語がどのようなポリシーでどのように振る舞うのか知るようにしてください。

ちょっと変わった書き方

裸の条件式

JavaScriptではifのあとで{ ... }と囲まない、という方法があります。 これはC言語やJavaなどにもある方法で、次のような具合です。

ただし、

という理由で避けるべき書き方とされています。

ifの後置

Perlの場合、ifを後に置くことができます。 英語的に言うと

I will go your home if you want.

のような倒置法ですね。

この記法はRubyにおいても使えます。

Perlではifに付随するカッコは省略できないのですが、 後置した場合は省略できます。

こちらは「何をするか」ということを前提として条件をつける場合にわかりやすい書き方です。

論理演算子

短絡評価される論理演算子を制御に使うこともあります。

こちらは処理は成功するものとして進められるのだけれど、それでも失敗した場合は…というケースによく使います。

ただし、perlは発生しないはずの失敗をしたときにを返すのでこのような書き方が便利なのですが、Rubyの場合はそもそもそのような場合は例外が発生するためあまり使わなくなっています。

これは、Rubyが論理演算子をあまり使わない、という意味ではありません。 条件分岐のためにはあまり使わない、ということです。

Fullsized Image