Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 841
от 06.09.2007, 00:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 500, Экспертов: 65
В номере:Вопросов: 1, Ответов: 6


Вопрос № 100401: Мне попался следующий код: int i=5; i= ++i + ++i; Чему равно i? Проверял на VS2005 получилось 14, почему? Ведь после первого инкремента должно быть 6, а после второго 7 т.е. в сумме 13, а получается как я понял 7+7....

Вопрос № 100.401
Мне попался следующий код:
int i=5;
i= ++i + ++i;
Чему равно i? Проверял на VS2005 получилось 14, почему? Ведь после первого инкремента должно быть 6, а после второго 7 т.е. в сумме 13, а получается как я понял 7+7.
Отправлен: 31.08.2007, 22:59
Вопрос задал: Виктор Малейчик (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 13)

Отвечает: din
Здравствуйте, Виктор Малейчик!
Все просто. Когда у вас выполняется инкрементирование в первый раз i равно 6, во второй раз равно 7, потом выполняется i = i+i где i равно 7. Для большей наглядности подставляем вместо i ее значение i = 7+7 (а не 6+7, i после второко инкремента равно уже 7 а не 6).
Удачи!
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Практикант)
Ответ отправлен: 01.09.2007, 00:50
Оценка за ответ: 4

Отвечает: Aristos
Здравствуйте, Виктор Малейчик!

Строку
i = ++i + ++i;
можно представить так:
++i;
++i;
i = i + i;
Отсюда ответ очевиден. В приложении asm код, который генерит компилятор.

Приложение:

Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 01.09.2007, 01:08
Оценка за ответ: 4

Отвечает: Rockie
Здравствуйте, Виктор Малейчик!

Дело в том, что результат этой операции - undefined behavior, "результат неопределен". Это значит, что в итоге можно получить что угодно - 13, 14, -123, format c:, и т.д. =) Это связано с наличием точек следования при разборе выражений компилятором. Подробнее можете почитать по ссылкам:

Точки следования (sequence points)
http://alenacpp.blogspot.com/2005/11/sequence-points.html

Undefined behaviour
http://ru.wikipedia.org/wiki/Неопределённое_поведение


Ответ отправил: Rockie (статус: 3-ий класс)
Ответ отправлен: 01.09.2007, 01:32
Оценка за ответ: 5

Отвечает: Архипов Александр Леонидович
Здравствуйте, Виктор Малейчик!
Всё правильно, просто вначале к i прибавляется 1, и получается i=6. Затем опять к i прибавляется 1 и получается 7, а уже потом два i складываются, но на этот момент i уже равно 7 и получается 7+7=14.
Ответ отправил: Архипов Александр Леонидович (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 07:31
Оценка за ответ: 4

Отвечает: Shurka
Здравствуйте, дорогой товарищ!
Но тут все относительно просто.
Дело вот в чем. Понятно, что сначала вычисляются слагаемые. Но дело в том,
что компилятор не копирует переменную i. Для него есть только ее адрес в памяти. Обозначим его А.
Поэтому вычисляя первый операнд, компилятор выдаст команду "увеличить содержимое адреса А на единицу", вычисляя второй операнд он СНОВА выдаст эту же команду: "увеличить содержимое адреса А на единицу". И наконец, складывая оба операнда он выдаст команду "сложить содержимое адреса А с содержимым адреса А".
Теперь надеюсь понятно, почему получиться 14.

// (* С++ до конца не знает никто *) //
Ответ отправил: Shurka (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 09:23
Оценка за ответ: 4

Отвечает: kool
Здравствуйте, Виктор Малейчик!
Все дело в приоритете унарной операции ++
над бинарной +, кот складывает два значения i.
Т.е. сначала

i==5
++i (i==6)
++i (i==7)
i+i==7+7=14
Выход - сделать так: i= ++i + i++;
Удачи!

---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 01.09.2007, 12:04
Оценка за ответ: 4


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.58 от 30.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное