![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EgoBrain |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
Всем привет.
Уже ни раз обсуждалось и множество статей разжевано, но к "заколдованным" местам спецификации С++ и Си приходится возвращаться вновь и вновь. Есть вещи, понимание которых приходит с трудом, да и логика стандарта весьма запутана местами.. И так, речь идет о таких темах как "Точки следования" и "Неуточненное либо Неопределенное поведение". Вот конкретный пример:
Я использую компилятор (так понимаю от версии зависит результат), входящий в соства VS 2010, получается вывод:
Почему? Предполагаю что оператор (функция) cout может выводить все значения изменяемой переменной до точки следования (если переменная изменялась больше одного раза), но вот почему второй результат 8? Требуется разъяснение на пальцах. |
||||
|
|||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
возможно, так станет понятней:
http://liveworkspace.org/code/e9c5b24bccb9...55bd87890456f7b вывод:
и обратите внимание на предупреждение компилятора. Это сообщение отредактировал(а) boostcoder - 24.2.2012, 05:27 |
||||
|
|||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
А что здесь такого? Было 6, сделано i++, потом ++i, получилось 8. Ну, в данном примере не такое уж неопределённое:
Первый шаг:
Второй шаг:
Это сообщение отредактировал(а) feodorv - 24.2.2012, 05:43 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
А операция помещения в поток вывода << является точкой следования?
Добавлено через 4 минуты и 34 секунды Блин, грубая невнимательность, заострив внимание на (++i)++ забыл про цикл.. |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Имхо, в данном коде никакого UB нет.
А вот здесь явно UB, поскольку здесь вторая i Операция помещения в поток не является точкой следования. Это сообщение отредактировал(а) volatile - 24.2.2012, 23:55 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |