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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
#1

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

14.12.2012, 19:21. Просмотров 393. Ответов 9
Метки нет (Все метки)

Здравствуйте!Возник вопрос касательно операции инкремента(++)

допутим у нас есть код
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.
Обьясните пожалуйста, никак понять не могу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 19:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Особенности инкремента (C++):

Секреты инкремента - C++
Пожалуйста!!! помогите! Умоляю!:help: i=5; j=(++i) + (++i): Чему равно j?; пожалуйста обьясните как это решается, ну или...

Перегрузка инкремента ++ - C++
Не понимаю как вызвать перегрузку инкремента: void operator ++( int m ); в функции main,какой синтаксис. Я в main циклично ввожу числа и...

Перегрузка инкремента - C++
Допустим, что некий класс имеет в наличии методы пре(и пост-)фиксного инкрементов. Date&amp; Date::operator++(); Date...

Перегрузка операции инкремента - C++
Как известно, постинкремент возвращает r-value, а преинкремент - l-value. То есть: ++(++x); // допустимо (x++)++; // ошибка...

Переопределение операции инкремента - C++
Добрый вечер! Задачка простая и кода с примерами в сети куча, но меня волнует вопрос почему компилятор ругается на мой код: Myclass...

Оператор перегрузки инкремента - C++
Добрый день. Мне нужна оценка кода. Правильно - ли я все сделал? Подскажите пожалуйста. если что не так. /*Создать класс с перегрузкой...

9
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,797
Записей в блоге: 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;
}
1
0x10
2465 / 1637 / 240
Регистрация: 24.11.2012
Сообщений: 4,039
14.12.2012, 19:27 #3
Undefined behavior. Подробнее вырезано
1
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.12.2012, 19:27 #4
Ищите инфу по точкам следования: http://alenacpp.blogspot.com/2005/11...ce-points.html
2
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
14.12.2012, 19:27  [ТС] #5
Avazart, обьясните пожлауйста, чем так кардинально отличается мой и ваш пример, что он на результат влияет(в вашем случае выводится всё по логике вещей).
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,797
Записей в блоге: 17
14.12.2012, 19:28 #6
Собственно как я помню порядок выполнения ++a и a++ не определен в строке
C++
1
std::cout<<a++<<' '<<++a;
Собственно у меня вообще 6 6 выдает, это и есть undefined behavior

Есть такое и Дьюхерсте
1
Oleshko
21 / 21 / 1
Регистрация: 11.12.2012
Сообщений: 64
14.12.2012, 19:32 #7
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
std::cout<<a++<<' '<<++a;
по моему, в стандарте не прописано об результате такого действия...
и как оно делается - известно только разработчикам компилятора
1
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,797
Записей в блоге: 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() будет вызвана последней.
Так что дело не в инкрементах как бы
2
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
14.12.2012, 19:48 #9
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
выводится не 5 и 7, как по логике должно быть, а выводится 6 и 7.
В принципе должно 6 6(потому что с право налево идем). Хотя не помню как оно в стандарте сказано.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,797
Записей в блоге: 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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 20:19
Привет! Вот еще темы с ответами:

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

Перегрузка префиксного инкремента - C++
Как перегрузить префиксальный инкремент? class Horse{ private: int x,y; public: Horse(void); void setX(int); ...

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

Перегрузка операторов инкремента - C++
Мне надо перегрузить инкримент, я пытался сделать постфиксный и + . Я вродебы сделал, но оно почему-то не выводит.( prog.h #pragma once...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
14.12.2012, 20:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru