> int i = 1; > > i += (i += 2) + 3; > > Console.WriteLine("{0}", i); > Console.ReadLine(); >>
> .locals init ([0] int32 i) > IL_0000: nop > IL_0001: ldc.i4.1 > IL_0002: stloc.0 > IL_0003: ldloc.0 // load i for the first += > IL_0004: ldloc.0 // load i for the second += > IL_0005: ldc.i4.2 > IL_0006: add > IL_0007: dup > IL_0008: stloc.0 // this is (i += 2) that is stored in i > IL_0009: ldc.i4.3 > IL_000a: add > IL_000b: add // this is the original value of i, loaded in IL_0003 > IL_000c: stloc.0 // i is overwritten >>
> int i = 1; > > i += 2; > i += i + 3; >>
>IL_0000: nop > IL_0001: ldc.i4.1 > IL_0002: stloc.0 > IL_0003: ldloc.0 > IL_0004: ldc.i4.2 > IL_0005: add > IL_0006: stloc.0 > IL_0007: ldloc.0 > IL_0008: ldloc.0 > IL_0009: ldc.i4.3 > IL_000a: add > IL_000b: add > IL_000c: stloc.0 >I think the documentation states that in these cases i is only evaluated once for the line. Given that the results will be as found.