形骸化している代入演算子の優先順位
true ? 1 : x = 2のようなソースがパースエラーにならないかどうか。
ちょっと調べた限りでは、
のように分かれております。
Javaと文法が似てると思ってたC#ですが、こんなところに違いがあったんですねぇ。
http://mono.kmc.gr.jp/~yhara/d/?date=20090108
を読んで思ったこと。
> こんなところに違いがあったんですねぇ
演算子の優先順位という観点でみると, 4言語とも(代入) < (条件)と同じなので, もしこの式が
true ? 1 : (x = 2)
とパースされるならそれはある意味でバグです.
ただ, Rubyに関して言えば代入式が括弧無しで右辺に来れるので,代入演算子の優先順位が崩れてしまうのは仕方がないことなんですよね。
例えば
x = 1 + x = 2
が
x = (1 + (x = 2))
になるなど、代入演算子の優先順位はもはや形だけになってしまっています。(この例だと左の=と右の=で使われている文法規則が違うのでこういうことになる)
私はこういった点をちゃんとドキュメントに明示しなければならない(代入演算子とひとくくりにしないで, 「〜にある代入演算子」と種別分けするとか)と思いますが,多分暗黙の了解があるんでしょうね。
ところで,C#はどうなんだろうか。