条件演算子と代入演算子
これは妙な構文規則を定義した C が元凶だと思っている。
C の規格書 (JIS X 3010) による条件演算子の構文規則は以下のようになる。
- 条件式
- 論理 OR 式
- 論理 OR 式
?
式:
条件式- 代入式
- 条件式
- 単項式 代入演算子 代入式
- 式
- 代入式
- 式
,
代入式
?
と :
の間には式が取れるのに :
の後には条件式しか取れない。そのため x ? x = 0 : 0
は OK なのに x ? 1 : x = 1
はエラーになる。
演算子の優先順位を考えると条件式の中に直接式を書けるのは確かにおかしい気もするが、条件演算子は三項演算子なので、?
と :
の間に式をおいても構文規則は曖昧にならない。いっぽう :
の後に式を置けるようにしてしまうと、カンマ演算子の順位が曖昧になってしまうので、そこには式は置けない。しかし :
の後に代入式を置けるようにしたとしても、実は曖昧にはならないのだ (代入演算子の左辺が単項式に限定されているため)。にも関わらず規格では :
の後は条件式と定めてしまった。どう考えてもおかしな定義の仕方だ。
不幸にもこの過ちは Java にも受け継がれてしまったが、ECMAScript や C# ではちゃんと直っている。つまり、:
の後に代入文が取れるように構文が定義されている。優先順位が逆転しているのでおかしな感じがするかもしれないが、文法は曖昧ではないし見た目もそんなに悪くないので俺はありだと思っている。Ruby の構文はもともとかなりアドホックなので C 等と同列に語ってはいけない気がする。
| 固定リンク
コメント