本当に「言語仕様のバグ」なのだろうか?
三項演算子が左結合であると、例えば次のような擬似コードにて意図しない挙動を示すだろう。
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
三項演算子は確かに便利であるものの、条件文全般の代わりにはなれない。
三項演算子が左結合だと、右結合である言語に慣れたプログラマに対して、ある種の書きにくさをもたらす。その書きにくさによって暗黙のうちに他の構文への書き換えを推奨していく、という発想は否定できないだろう。