Форум программистов, компьютерный форум CyberForum.ru

Особенности инкремента - C++

Восстановить пароль Регистрация
 
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
14.12.2012, 19:21     Особенности инкремента #1
Здравствуйте!Возник вопрос касательно операции инкремента(++)

допутим у нас есть код
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    int a=5;
    std::cout<<a++;
    return 0;
}
согласно правилам он сначала выводит на экран, а потом увеличивает на единицу.Всё так и работает.

Тогда по чему в коде
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    int a=5;
    std::cout<<a++<<' '<<++a;
    return 0;
}
выводится не 5 и 7, как по логике должно быть, а выводится 6 и 7.
Обьясните пожалуйста, никак понять не могу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 19:21     Особенности инкремента
Посмотрите здесь:

Секреты инкремента C++
C++ Операция инкремента и декримента на С++
C++ Использование инкремента(Декремента)
C++ Переопределение операции инкремента
Перегрузка инкремента ++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,575
Записей в блоге: 17
14.12.2012, 19:23     Особенности инкремента #2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    int a=5;
 
    std::cout<<a++<<' ';
    std::cout<<++a;
 
    return 0;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.12.2012, 19:27     Особенности инкремента #3
Undefined behavior. Подробнее вырезано
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.12.2012, 19:27     Особенности инкремента #4
Ищите инфу по точкам следования: http://alenacpp.blogspot.com/2005/11...ce-points.html
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
14.12.2012, 19:27  [ТС]     Особенности инкремента #5
Avazart, обьясните пожлауйста, чем так кардинально отличается мой и ваш пример, что он на результат влияет(в вашем случае выводится всё по логике вещей).
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,575
Записей в блоге: 17
14.12.2012, 19:28     Особенности инкремента #6
Собственно как я помню порядок выполнения ++a и a++ не определен в строке
C++
1
std::cout<<a++<<' '<<++a;
Собственно у меня вообще 6 6 выдает, это и есть undefined behavior

Есть такое и Дьюхерсте
Oleshko
 Аватар для Oleshko
21 / 21 / 1
Регистрация: 11.12.2012
Сообщений: 64
14.12.2012, 19:32     Особенности инкремента #7
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
std::cout<<a++<<' '<<++a;
по моему, в стандарте не прописано об результате такого действия...
и как оно делается - известно только разработчикам компилятора
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,575
Записей в блоге: 17
14.12.2012, 19:34     Особенности инкремента #8
Тоже касается ф-ций ( из ссылки)
Пример с функциями:
C++
1
2
3
4
void f(int, int);
int g();
int h();
f(g(), h());
По Стандарту неизвестно, какая из функций g или h будет вызвана первой, но известно, что f() будет вызвана последней.
Так что дело не в инкрементах как бы
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
14.12.2012, 19:48     Особенности инкремента #9
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
выводится не 5 и 7, как по логике должно быть, а выводится 6 и 7.
В принципе должно 6 6(потому что с право налево идем). Хотя не помню как оно в стандарте сказано.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 20:19     Особенности инкремента
Еще ссылки по теме:

Перегрузка префиксного инкремента C++
Ассоциативность инкремента декремента C++
C++ Перегрузка инкремента

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,575
Записей в блоге: 17
14.12.2012, 20:19     Особенности инкремента #10
Идем справа налево в плане возвращаемых значений, но не в плане их расчета.

Добавлено через 17 минут
Собственно то же что и

C++
1
2
3
4
5
6
7
8
9
int f(){std::cout<<"f()\n"; return 1;}
int h(){std::cout<<"h()\n"; return 2;}
 
int main()
{
int z= f()+ h(); // ответ 3, но порядок непредсказуем
 
result 0;
}
Yandex
Объявления
14.12.2012, 20:19     Особенности инкремента
Ответ Создать тему
Опции темы

Текущее время: 17:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru