http://blogs.wankuma.com/rti/archive/2009/06/08/174492.aspx
インクリメント演算子を前後に置いたときの優先順位
懲りずに
インクリメント演算子の前後置き
について、しつこくエントリーを上げます。
はっきし言って駄文ですw
前回のコメントで aetos さんがいいこと言った。
[引用]
# re: インクリメント演算子を前後に置いたときの優先順位 2009/06/09 11:51 aetos
なんか違和感がある。
int i = ++x; の場合、++x の式の値は x + 1 です。
int i = x++; の場合、x++ の式の値は x です?
C# の言語仕様では、代入 = の優先順位は最低です。
なので、前置の場合は、まず優先順位の高い ++x が行われ、続いて = が行われます。
後置の場合は? なんだか i = x が先に行われ、後で x++ が行われているようにも見えます。
式の値の決定のタイミングを考えると、前置でも後置でも = より先です。
前置は言うに及ばず、後置は、式の値を x と決定してから代入が行われています。加算は代入の前でも後でも構いません(既に式の値は決定しているので、代入の結果は変化しません)。
うーん? 関係あるようなないような?
[/引用]
あると思います!
同じ優先順位の演算子が複数ある式の場合は、代入演算子と複合代入演算子の優先順位は右から、それ以外の演算子は左から評価されます。
でも、後置き演算子は、代入の後に実行されています。
そこで、前回のエントリーにもあった以下のリンク先を見てみます。
http://msdn.microsoft.com/ja-jp/library/aa691323.aspx
7.2.1 演算子の優先順位と結合規則
[引用]
セクション カテゴリ 演算子
7.5 基本式 x.y f(x) a[x] x++ x-- new
typeof checked unchecked
7.6 単項式 + - ! ~ ++x --x (T)x
[/引用]
メソッドの引数に後置きインクリメント(デクリメント)演算子を用いた時と同じ挙動になる理由としては、メンバアクセス演算子や、要素アクセス演算子などと同列だからという理由が考えられるんですよね。
でも、基本式の演算の評価順序は最優先になってます。
基本式を最優先にしないと次のように記述できませんからねぇ・・・
var i = Value[1] + value[2] + GetValue(a++);
実際に実行すると、上記の演算式の評価は、次の順序になると思います。
Value[1] の値の取得
Value[2] の値の取得
Value[1] に Value[2] の値を加算
GetValue(a) を実行して結果を取得
Value[1] + Value[2] の計算結果に、GetValue(a) によって得た値を加算
a 値をインクリメント
ほらね、何か変なの~ ・・・・と、話が最初に戻る訳ですよw
【上記の疑問は解決しますた】
コメントにて、えムナウ先生と青柳さんの二人で解説してもらって上記の疑問は解決しますた。
なるほど、なるほど~(U字工事調でお願いします)
Value[1] の値の取得
Value[2] の値の取得
Value[1] に Value[2] の値を加算
a 値を保存
a 値をインクリメント←インクリメント演算子は、ここで実行されている!
GetValue(保存した a の値) を実行して結果を取得
Value[1] + Value[2] の計算結果に、GetValue(a) によって得た値を加算