比較と代入と算術の演算子
- 比較と代入の演算子 (R.Tanaka.Ichiro's Blog)
何か面白い事になってます。 ^^
派生でこんな↓の試してみました。
var i = 1; var j = 0; Console.WriteLine((j = i++) == i);
見た目だと判りにくいですが、こんな感じで処理されるみたいです。(一応、 IL で確認しました)
- j に i の値 (1) を代入
- i をインクリメント(この時点で i は 2 になる)
- j に代入した値 (1) と i (2) を比較 ⇒ False
従って、 False と出力されます。
なお、以下の様に、インクリメントの順番を変えると True になります。
var i = 1; var j = 0; Console.WriteLine((j = ++i) == i);
一応、処理の流れ。
- i をインクリメント(この時点で i は 2 になる)
- j に i の値 (2) を代入
- j に代入した値 (2) と i (2) を比較 ⇒ True
こうやって自分で調べてみると、より理解が深まって面白いです。
IL で確認すると云う手段を提示してくれた(結果として IL の読み方を調べるきっかけになった)えムナウさんに感謝。 m(_ _)m
ちなみに、前者の例の IL コード。(おまけ: C# で作った実行ファイルを Reflector で IL コードに変換したもの)
.method private hidebysig static void Main() cil managed { .entrypoint .maxstack 3 .locals init ( [0] int32 num, [1] int32 num2) L_0000: nop L_0001: ldc.i4.1 L_0002: stloc.0 L_0003: ldc.i4.2 L_0004: stloc.1 L_0005: ldloc.0 L_0006: dup L_0007: ldc.i4.1 L_0008: add L_0009: stloc.0 L_000a: dup L_000b: stloc.1 L_000c: ldloc.0 L_000d: ceq L_000f: call void [mscorlib]System.Console::WriteLine(bool) L_0014: nop L_0015: ret }