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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Neznaika
сообщение 11.08.2007 20:13
Сообщение #2


Пионер
**

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

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


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 ???


Теперь понятно, почему эти уроды у меня не живут.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



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