Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cout<<(++i)++ "Точки следования и приоритеты", Снова о unspecified и undefined behavior 
V
    Опции темы
EgoBrain
Дата 24.2.2012, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Всем привет.
Уже ни раз обсуждалось и множество статей разжевано, но к "заколдованным" местам спецификации С++ и Си приходится возвращаться вновь и вновь. Есть вещи, понимание которых приходит с трудом, да и логика стандарта весьма запутана местами..  smile 
И так, речь идет о таких темах как "Точки следования" и "Неуточненное либо Неопределенное поведение".
Вот конкретный пример:
Код

int i = 5;
do
{
    cout<<(++i)++<<" "; //undefined behavior
}
while(i >= 5 && i < 8);

cout<<endl;

Я использую компилятор (так понимаю от версии зависит результат), входящий в соства VS 2010, получается вывод:
Цитата

6 8

Почему?
Предполагаю что оператор (функция) cout может выводить все значения изменяемой переменной до точки следования (если переменная изменялась больше одного раза), но вот почему второй результат 8? Требуется разъяснение на пальцах.
PM MAIL ICQ Skype   Вверх
boostcoder
Дата 24.2.2012, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



возможно, так станет понятней:
Код

#include <iostream>

int main() {
   int i = 5;
   do {
       std::cout << "(" << (++i)++ << ", " << i << ")" << std::endl;
   } while(i >= 5 && i < 8);
}


http://liveworkspace.org/code/e9c5b24bccb9...55bd87890456f7b

вывод:
Цитата

(6, 7)
(8, 9)


и обратите внимание на предупреждение компилятора.

Это сообщение отредактировал(а) boostcoder - 24.2.2012, 05:27
PM WWW   Вверх
feodorv
Дата 24.2.2012, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(EgoBrain @  24.2.2012,  04:38 Найти цитируемый пост)
но вот почему второй результат 8

А что здесь такого? Было 6, сделано i++, потом ++i, получилось 8.

Цитата(EgoBrain @  24.2.2012,  04:38 Найти цитируемый пост)
Неопределенное поведение

Ну, в данном примере не такое уж неопределённое:
Код

int i = 5;
do
{
    ++i;
    cout<<i;
    i++;
    cout<<" ";
}
while(i >= 5 && i < 8);
cout<<endl;


Первый шаг:
Цитата

++i                       => 6
cout<<i<<" "           => печатаем 6
i++                       => 7
(i >= 5 && i < 8)     => удовлетворяем условию


Второй шаг:
Цитата

++i                       => 8
cout<<i<<" "           => печатаем 8
i++                       => 9
(i >= 5 && i < 8)     => не удовлетворяем условию




Это сообщение отредактировал(а) feodorv - 24.2.2012, 05:43


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
EgoBrain
Дата 24.2.2012, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



А операция помещения в поток вывода << является точкой следования?

Добавлено через 4 минуты и 34 секунды
Блин, грубая невнимательность, заострив внимание на (++i)++ забыл про цикл..
PM MAIL ICQ Skype   Вверх
feodorv
Дата 24.2.2012, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(EgoBrain @  24.2.2012,  05:33 Найти цитируемый пост)
А операция помещения в поток вывода << является точкой следования? 

Цитата

В Си++ перегруженные операторы выступают в роли функций, поэтому точкой следования является вызов перегруженного оператора.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 24.2.2012, 23:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(EgoBrain @  24.2.2012,  04:38 Найти цитируемый пост)
int i = 5;
do
{
    cout<<(++i)++<<" "; //undefined behavior
}
while(i >= 5 && i < 8);

cout<<endl;

Имхо, в данном коде никакого UB нет.

Цитата(boostcoder @  24.2.2012,  05:25 Найти цитируемый пост)
 std::cout << "(" << (++i)++ << ", " << i << ")" << std::endl;

А вот здесь явно UB, поскольку здесь вторая i
Операция помещения в поток не является точкой следования.


Это сообщение отредактировал(а) volatile - 24.2.2012, 23:55
PM MAIL   Вверх
boostcoder
Дата 25.2.2012, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(volatile @  24.2.2012,  23:52 Найти цитируемый пост)
А вот здесь явно UB, поскольку здесь вторая i

таки верно!

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.