雑記 - otherwise

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

式のトレース

MSIL でチェックしたところ、違う結果が出ました。。。
以下、 R さんのコメントで違った点。

  • 右辺の「 1 * 」のところは最適化で消えてしまうみたいです
  • 評価の順番は、 not, and, increment, negate, subtraction, decrement, xor, or, multiplication でした

ってことで、 R さんの記述に合わせて書き下すとこんな感じでしょうか。
※行頭の [] 内の数値は、評価後の i の値

[0] i *= ~i & 2 | 1 * (++i) - -(i--) ^ i; // 最初の状態
[0] i *= ~i & 2 | (++i) - -(i--) ^ i; // コンパイルした状態
[0] i *= -1 & 2 | (++i) - -(i--) ^ i; // NOT 演算子 (~) を評価
[0] i *= 2 | (++i) - -(i--) ^ i; // AND 演算子 (&) を評価
[1] i *= 2 | 1 - -(i--) ^ i; // 単項式 (++) を評価
[1] i *= 2 | 1 - -(1) ^ i; // 単項式 (--) を評価( i への反映は減算式評価後) i == 0
[1] i *= 2 | 1 - (-1) ^ i; // 符号逆転
[0] i *= 2 | 2 ^ i; // 減算式を評価(※ここで単項式 -- の評価結果が i に反映される)
[0] i *= 2 | 2 ^ 0; // i を代入
[0] i *= 2 | 2; // XOR演算子 (^) を評価
[0] i *= 2; // OR演算子 (|) を評価
[0] i *= 2; // 復号代入演算子 (*=) を評価
[0]