++a + ++a; 複数の前置インクリメントを式に入れたら動作は未定義 int a = 1; int tmp1 = a + 1; a = tmp1; int tmp2 = a + 1; a = tmp2; int b = tmp1 + tmp2; int a = 1; a = a + 1; a = a + 1; int tmp = a + a int b = tmp; clang++の解釈 g++の解釈
++a + ++a; int a = 1; int tmp1 = a + 1; a = tmp1; int b = tmp1 + ++a; int a = 1; int tmp1 = a + 1; a = tmp1; int tmp2 = a + 1; a = tmp2; int b = tmp1 + tmp2; ++aを再帰的に tmp = a + 1; に展開
} GCCの気持ちの調べ方 $ gcc -c -fdump-tree-all test.c int func (int a) { int D.2719; a = a + 1; a = a + 1; D.2719 = a * 2; return D.2719; } GIMPLE中間表現を吐く 中間表現を 読み解く