Ruby
PHP
三項演算子

三項演算子の罠

More than 1 year has passed since last update.

多くの言語に存在する三項演算子(? :)ですが、ときどき引っかかるポイントがあります。なお、「どのような場面で、三項演算子を使うべきか、あるいは使わないべきか」という議論には踏み込まないこととします。


名称

よく「『三項演算子』という言い方は項数を表しているに過ぎないから、『条件演算子』と言った方がいい」という言説を聞きます。確かに、正確に言えば「三項演算子」ではあらゆる三項の演算子が入ってしまうことになります。

ただ、多くのプログラミング言語では、関数呼び出しや添字といった、項数が可変となる演算子を除いて、三項の演算子は? :しかありません。一方で、短絡評価を行う&&||を、Javaでは「条件And演算子」「条件Or演算子」というように、条件演算子に区分しています。そのような状況を考えれば、言語がはっきりしている環境では「三項演算子」と呼ぶほうが通りもいいし、それで問題ないかなと考えています。


PHP

PHPの場合、(条件a) ? 値1 : (条件b) ? 値2 : 値3のように書くと、左結合((条件a) ? 値1 : (条件b)) ? 値2 : 値3のように処理されてしまいます。三項演算子の結果を次の三項演算子の条件にしてしまうという、直感的でない解釈がされますので、正しくカッコで括るなど、気をつけましょう。


Ruby

Rubyにも三項演算子がありますが、こちらではトークンの多様性が問題となってきます。

と、?:の前後に英字を続けたものすべてがトークンになり得てしまうのです。ということで、Rubyで三項演算子を使う場合、?の前後、:の前後のスペースは必須と考えておいたほうがいいです(カッコが続く場合などはなくても通りますが)。