i = ++i + ++i;
Оператор ++ используется только с ПЕРЕМЕННОЙ и производит ДВА результата:
1) сначала на 1 увеличивается i;
2) результат (++i) равен первоначальному значению i плюс 1.
Следовательно исходный оператор можно разделить на 3:
temp1 = ++i;
temp2 = ++i;
i = temp1 + temp2;
В каком порядке вычисляются temp1 и temp2 не имеет значения, поэтому, если сначала i = 5,
то после (i = ++i + ++i) i должно быть равно 13.
Правая часть вычисляется независимо от левой. I увеличивается на 1 всего два раза и далее в последней
операции сложения не участвует. Откуда BDS2006 и VS2005 получают 14???
Справа два (++i) зависят друг от друга, но левое i... Это же всего лишь приёмник. Разве не так?
Цитата
inc dword ptr [ebp-$04]
inc dword ptr [ebp-$04]
mov eax,[ebp-$04] ; eax = temp2 temp1 потерян.
add [ebp-$04],eax ; i = temp2 + temp2
Цитата
eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax ; i = temp1
mov ecx,dword ptr [i]
add ecx,1
mov dword ptr [i],ecx ; i = temp2
mov edx,dword ptr [i]
add edx,dword ptr [i]
mov dword ptr [i],edx ; i = temp2 + temp2 ???
Теперь понятно, почему эти уроды у меня не живут.