IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> ++i, в с++ и java
мисс_граффити
сообщение 21.07.2007 18:08
Сообщение #1


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


здравствуйте...
есть небольшой кусочек кода:
    int i=5;
i=++i + ++i;

java считает, что получается 13 (я с ней согласна...
0) ++i равно 6
1) ++i равно 7
2) 6+7=13)
а вот с++ (пользуюсь с++ builder 5) уверен, что 14.

вопрос: это фишка языка или компилятора (то есть что получится при использовании другого с++-ного компилятора)? и откуда, все же, берется 14?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
мисс_граффити
сообщение 22.07.2007 23:06
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


нашла статейку по этому поводу, разобралась окончательно.
спасибо большое!


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hardcase
сообщение 6.08.2007 18:30
Сообщение #3


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(мисс_граффити @ 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


Сообщение отредактировано: hardcase - 6.08.2007 18:41


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 16:29
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"