Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > cout<<(++i)++ "Точки следования и приоритеты"


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

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

cout<<endl;

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

6 8

Почему?
Предполагаю что оператор (функция) cout может выводить все значения изменяемой переменной до точки следования (если переменная изменялась больше одного раза), но вот почему второй результат 8? Требуется разъяснение на пальцах.

Автор: boostcoder 24.2.2012, 05:25
возможно, так станет понятней:
Код

#include <iostream>

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


http://liveworkspace.org/code/e9c5b24bccb9fe56655bd87890456f7b

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

(6, 7)
(8, 9)


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

Автор: feodorv 24.2.2012, 05:33
Цитата(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)     => не удовлетворяем условию



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

Добавлено через 4 минуты и 34 секунды
Блин, грубая невнимательность, заострив внимание на (++i)++ забыл про цикл..

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

Цитата

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

Автор: volatile 24.2.2012, 23:52
Цитата(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
Операция помещения в поток не является точкой следования.

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

таки верно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)