Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110

Вывод в поток и операция инкремента / декремента

09.11.2012, 13:33. Показов 1720. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При использовании следующего оператора вывода в поток:
C++
1
2
int n = 10;
cout << n++ << ' ' << n << ' ' << --n << endl;
получил такой странный вывод:
9 10 10
Я знаю, что в принцыпе это undefined behavior и зависит от реализации компилятора, но все же... Результат схож с вычислением этих переменных при передаче в функция в VS, где вычисление выражений реализовано с права на лево, но ведь вывод в поток - это перегруженый оператор <<, то есть функция с одним параметром, возвращающая ссылку на поток.
Что еще печальнее, вывод аналогичен использованию:
C++
1
printf("%d %d %d\n", m++, m, --m);
А это вообще функция с неопределенным количеством аргументов, которые тоже должны вычислятся слева на право по смещению указателя на размер типа следующего аргумента...
Может кто-нибудь все-таки объяснит как это все реализовано?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2012, 13:33
Ответы с готовыми решениями:

Использование инкремента(Декремента)
Есть три кнопки и три индикатора(лампочки). Если нажимаю кнопку-1 тогда включается лампочка нажимаю еще раз выключается. Если по одному...

Операторы инкремента и декремента
в роди понимаю как работает,начинаю проверять вручную и не получается. помогите разобраться как считает эта программа. static void...

Ассоциативность инкремента декремента
Всем привет. Вот такую табличку недавно нашел - http://ru.cppreference.com/w/cpp/language/operator_precedence Почему префиксный...

13
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.11.2012, 13:48
Приоритет операций Вам о чем-нибудь говорит?
Сначала выполняется --n, потом вызов cout, потом n+1, потом cout два раза.

Что касается второго случая, то сначала --m, потом вызов printf (m при этом равен m-1), потом m++

Добавлено через 5 минут
Разбейте вот так:
C++
1
2
3
cout <<n++<<' ';
cout<<n;
cout<<' '<<--n<< endl;
А вот так везде будет n:
C++
1
2
cout <<n++<<' ';
cout<<n<<' '<<--n<< endl;
0
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
09.11.2012, 13:57  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Что касается второго случая, то сначала --m, потом вызов printf (m при этом равен m-1), потом m++
Но почему тогда вывод точно такой же, как и с использованием потока? Ведь printf() вызывается с агрументом m - 1?


Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
1 cout <<n++<<' ';
2 cout<<n;
3 cout<<' '<<--n<< endl;
У Вас здесь точно все так? Ведь вывод совсем другой?
0
 Аватар для Oberok
6 / 6 / 2
Регистрация: 11.03.2011
Сообщений: 40
09.11.2012, 14:00
По моему тут дело не в приоритете операций а в использовании префиксного постфиксного инкремента.
Я думаю что объяснить такое поведение можно так:
Вы просто используете в первом вызове постфиксную версию инкремента i++, а в конце префиксную версию декремента --i.
Постфиксная версия работает следующим образом:
сначала возвращается старое значение, а затем прибавляется единица(вывели 10 прибавили единицу).
Далее выводится уже увеличенное на единицу значение(11).
И в конце используется префиксная форма декремента, которая сначала инкрементирует значение, а потом возвращает его( отняли единицу вывели значение 10).
А вывод как положено производится слева направо.
0
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
09.11.2012, 14:08  [ТС]
Цитата Сообщение от Oberok Посмотреть сообщение
сначала возвращается старое значение, а затем прибавляется единица(вывели 10 прибавили единицу).
Далее выводится уже увеличенное на единицу значение(11).
И в конце используется префиксная форма декремента, которая сначала инкрементирует значение, а потом возвращает его( отняли единицу вывели значение 10).
А вывод как положено производится слева направо.
Но выводиться 9 10 10. Если предположить, что операторы выполняються по порядку с учитыванием приоритета, то должно было быть 9 9 10:
C++
1
2
3
cout << --n <<' ';
cout << n++;
cout << ' ' << n << endl;
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.11.2012, 14:08
Вот Вам интересный пример =)
C++
1
cout <<(n+=5)<<' '<<n++<<' '<<--n<<endl;
Результат: 14 9 15
0
 Аватар для Oberok
6 / 6 / 2
Регистрация: 11.03.2011
Сообщений: 40
09.11.2012, 14:14
Честно не знаю, у меня этот код выводит как и следовало ожидать 10 11 10.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using std::cout;
using std::endl;
 
int main()
{
  
  int n = 10;
  cout << n++ << ' ' << n << ' ' << --n << endl;
 
 
  system("PAUSE");
  return 0;
}
А этот 15 15 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using std::cout;
using std::endl;
 
int main()
{
  int n = 10;
  
  cout <<(n+=5)<<' '<<n++<<' '<<--n<<endl; 
 
  system("PAUSE");
  return 0;
}
0
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
09.11.2012, 14:15  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Результат: 14 9 15
Использую VS 2008. У меня вывело 15 9 15!

Добавлено через 30 секунд
Цитата Сообщение от Oberok Посмотреть сообщение
Честно не знаю, у меня этот код выводит как и следовало ожидать 10 11 10.
А какой компилятор?
0
 Аватар для Oberok
6 / 6 / 2
Регистрация: 11.03.2011
Сообщений: 40
09.11.2012, 14:20
Dev C++, QtCreator
Вот небольшая статья на тему инкремента и декремента.
http://cppstudio.com/uchebniki... menta-v-s/
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.11.2012, 14:21
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Использую VS 2008. У меня вывело 15 9 15!
у меня 2012 вывел 14 9 15.
mingw - 15 9 15
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.11.2012, 14:32
Собственно, если заранее было известно, что это UB, то в чем суть топика? Объяснить, как конкретный компилятор разрулил это UB?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
09.11.2012, 14:37
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
А какой компилятор?
А в данном случае это без разницы. Undefined behavior оно такое undefined..... :-) Не только на разных компиляторах, но даже на сборках Debug и Release одного и того же компилятора могут получаться совершенно разные результаты. Ибо undefined.....
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.11.2012, 15:26
Что нибудь про точки следования слыхали? :http://alenacpp.blogspot.com/2... oints.html
1
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
09.11.2012, 15:39  [ТС]
Цитата Сообщение от yuron_477 Посмотреть сообщение
Что нибудь про точки следования слыхали?
Ценная информация! Спасибо! В принципе, тему можно закрывать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2012, 15:39
Помогаю со студенческими работами здесь

Операторы инкремента и декремента
Создайте в классе Circle префиксный и постфиксный операторы инкремента и декремента, воздействующие только на член-данное радиус itsRadius.

Приоритет логического И и инкремента/декремента
Согласно таблице приоритетов, приоритет инкремента и декремента выше, чем у логического И и по идее следующий код: 0 &amp;&amp; ++x ...

Вычисление инкремента, декремента. Объяснить код
double u = 0.5; int f = ((int)u + (int)++u); Пожалуйста, объясните. Почему f = 1 Ведь сначала, выполняется префиксный инкремент...

Перегрузка инкремента\декремента. Комплексные числа
Есть класс комплексных чисел, для него перегружаем инкремент или декремент. Если остальные перегрузки работают так как надо, то эти двое...

Постфиксная и префиксная форма инкремента и декремента.
Само задание: Написать программу с примерами постфиксной и префиксной формами инкремента и декремента. Число вводится с клавиатуры. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru