Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Опять задачка с инкрементом  (Прочитано 13976 раз)
0 Пользователей и 1 Гость смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 15-11-2005 12:11 » 

Кажется, был уже такой вопрос.... Но не помню что ответили.
Попробуйте посчитать в уме - что будет на экране?

int i = 1;
i += i++ + ++i;
cout << i << endl;

Когда я посчитал - я проверил на MSVC 6. У меня сошлось.
А мой друг проверил на Java - у него по-другому получилось.....

Что по этому поводу говорит RTFM ?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Alf
Гость
« Ответ #1 : 15-11-2005 12:32 » 

На 100% не ручаюсь, но вроде бы попадалось, что если элементы выражения обладают побочными эффектами (как в данном случае), результат может быть неопределенным. Даже на одном компиляторе при разных схемах оптимизации результат может отличаться, а уж в разных языках - и подавно.
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #2 : 15-11-2005 12:43 » 

baldr, а можешь сказать какие результаты на Java? На C# сошлось с ожидаемым, а вот Java под рукой нет... MSDN определяет операции одинаково для C#, C++, и Java.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 15-11-2005 12:48 » 

Я посчитал в уме - у меня получилось 7.
MSVC 6 сказал, что будет 7.
На Java получилось 5.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #4 : 15-11-2005 12:59 » 

На C# 5 получается, на C++ и вправду ожидал увидеть 7 Улыбаюсь
Тут, похоже, дело в том, что java и C# (как наследник Java) читает левую часть оператора "+=" до выполения правой части, а C++ - после. Тогда все сходится. А почему именно так - это уже вопросы не к инкременту, а к самому языку
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 15-11-2005 14:39 » 

Расмотрим простой пример i += 1 Эту формулу можно записать так  i = i + 1 . Т.е. это будут равнозначные перемешения, даюшие один и тот же ответ.

Теперь если расмотрим вышеприведенную формулу, то
i +=    i++ + ++i
i = i +  i++ + ++i
Тоже должны быть равнозначны. Для Вижуала это не так. Чтобы для него это было равнозначным, запись должна идти так
i = i +  (i++ + ++i)
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 15-11-2005 15:53 » 

Стандарт языка Си, пункт 6.5.16 Assignment operators, параграф 4

    The order of evaluation of the operands is unspecified.

Результат зависит от компилятора. Если сначала вычисляется правый операнд ( i++ + ++i ), то результат равен 7, если сначала вычисляется левый операнд, то результат 5.
« Последнее редактирование: 15-11-2005 16:01 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
NetRaider
Гость
« Ответ #7 : 16-11-2005 01:40 » 

Стандарт языка Си, пункт 6.5.16 Assignment operators, параграф 4

    The order of evaluation of the operands is unspecified.

Результат зависит от компилятора. Если сначала вычисляется правый операнд ( i++ + ++i ), то результат равен 7, если сначала вычисляется левый операнд, то результат 5.

Здесь порядок вычисления роли не играет.  Будет undefined behavior.  Как минимум двукратная модификация скалярного объекта между  соседними точками следования(в одном выражении).

5/4 "Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined."
Записан
LP
Помогающий

ru
Offline Offline

« Ответ #8 : 25-11-2005 18:26 » new

В одном тесте был такой вопрос: что выдаст такой код?
Код:
char c=0;
std::cout << c++ << c;
Ответ: Поведение неопределено Улыбаюсь
Здесь это хорошо расписано http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.undefined
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines