Цитата(мисс_граффити @ 23.07.2007 0:06)
нашла статейку по этому поводу, разобралась окончательно.
спасибо большое!
Темка устарела, но в догонку оставлю пост.
Вот результат дизассемблирования строки i = ++i + ++i (BDS2006, без какой либо оптимизации)
Код
Unit1.c.12: i = ++i + ++i;
0040117B FF45FC inc dword ptr [ebp-$04]
0040117E FF45FC inc dword ptr [ebp-$04]
00401181 8B45FC mov eax,[ebp-$04]
00401184 0145FC add [ebp-$04],eax
Видно,что сперва компилер выполнил ++i 2 раза, потом сложил и результат поместил снова в i.
В результате получаем 14.
Для Vs2005 можно увидеть такой код (без оптимизации)
Код
i = ++i + ++i;
00401BFD mov eax,dword ptr [i]
00401C00 add eax,1
00401C03 mov dword ptr [i],eax
00401C06 mov ecx,dword ptr [i]
00401C09 add ecx,1
00401C0C mov dword ptr [i],ecx
00401C0F mov edx,dword ptr [i]
00401C12 add edx,dword ptr [i]
00401C15 mov dword ptr [i],edx
с оптимизацией всю кухную компилер заменил на инструкцию lea, i находится в eax
Код
i = ++i + ++i;
00401019 lea eax,[eax+eax+4]
в обоих случаях получаем 14
Для C# в той же Vs2005 получим 13, вот листинг дизассемблирования:
Код
int i = 5;
00000027 mov esi,5
i = ++i + ++i;
0000002c inc esi
0000002d mov edi,esi
0000002f inc esi
00000030 add esi,edi