PHPの三項演算子が左結合という仕様は本当にバグなのか?

本当に「言語仕様のバグ」なのだろうか?

三項演算子が左結合であると、例えば次のような擬似コードにて意図しない挙動を示すだろう。

variable = expr1 ? value1 : expr2 ? value2 : value3

これは事実だ。否定しようがない。

しかし、よく考えれば別の可能性がある。

可読性のためにかっこによるグループ化を強制する言語仕様である

つまり暗黙のうちに次のような書き方を強制している。

variable = expr1 ? value1 : (expr2 ? value2 : value3)

C言語系というかALGOL系というか、普段目にすることの多いプログラミング言語では、かっこはグループ化を表すための道具だ。言語仕様的にかっこが不要である場面であっても、自分の意図を明確にするためにかっこを用いるプログラマは多い。

三項演算子は便利である反面、怪しげなコードを書きやすくなる。それを和らげるためにかっこを使う人は少なくない。この思想を推し進めて「わざと左結合にすることで、かっこの使用を強制する」という言語仕様にする、という発想は一概には否定できないだろう。

可読性のために他の構文への書き換えを推奨する言語仕様である

もし三項演算子が使いにくいのならば、他の構文を使うはずだ。例えはif構文。

if expr1
    variable = value1
elsif expr2
    variable = value2
else
    variable = value3
end

ifが式である言語なら、次のように記述することも可能だろう。

variable = if expr1    then value1
           elsif expr2 then value2
           else             value3
           end

言語によってはif以外の構文も使用可能だろう。例えばRubyのcase式やGo言語のswitch文などだ。

コードは明快に書くべきだ。明快なコードは、大抵は短くなる。しかしコードの明快さと短さは同義ではない。明快なコードに仕立てることで長くなるケースもある。

先にも書いたように、三項演算子は便利である反面、怪しげなコードを書きやすくなる。特に三項演算子のネストは、コードが短くなる代償に可読性が落ちる。

基本的には、三項演算子は次のような短い式での利用にとどめるべきだ。

variable = expr1 ? value1 : value2

三項演算子は確かに便利であるものの、条件文全般の代わりにはなれない。

三項演算子が左結合だと、右結合である言語に慣れたプログラマに対して、ある種の書きにくさをもたらす。その書きにくさによって暗黙のうちに他の構文への書き換えを推奨していく、という発想は否定できないだろう。

結論

コードの可読性を上げるために三項演算子の便利さを制限しているのならば、三項演算子が左結合であることは「言語仕様のバグ」とまでは言えないだろう。むしろ便利すぎて悪用できてしまう右結合を採用している他の言語の方が「言語仕様のバグ」を抱えている、という見方ができる(暴論だ)。

まあでもPHPのアレは、上記のような発想に基づくものではないだろうなあ。

ついでにいえば、私も三項演算子は右結合の方が……。