読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

比較と代入と算術の演算子

C#

何か面白い事になってます。 ^^
派生でこんな↓の試してみました。

var i = 1;
var j = 0;
Console.WriteLine((j = i++) == i);

見た目だと判りにくいですが、こんな感じで処理されるみたいです。(一応、 IL で確認しました)

  1. j に i の値 (1) を代入
  2. i をインクリメント(この時点で i は 2 になる)
  3. j に代入した値 (1) と i (2) を比較 ⇒ False

従って、 False と出力されます。
なお、以下の様に、インクリメントの順番を変えると True になります。

var i = 1;
var j = 0;
Console.WriteLine((j = ++i) == i);

一応、処理の流れ。

  1. i をインクリメント(この時点で i は 2 になる)
  2. j に i の値 (2) を代入
  3. 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 
}