Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
1

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

14.12.2012, 19:21. Просмотров 439. Ответов 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
Ответы с готовыми решениями:

Перегрузка инкремента
Допустим, что некий класс имеет в наличии методы пре(и пост-)фиксного...

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

Перегрузка инкремента ++
Не понимаю как вызвать перегрузку инкремента: void operator ++( int m ); в...

Ассоциативность инкремента декремента
Всем привет. Вот такую табличку недавно нашел -...

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

9
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 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
2580 / 1759 / 289
Регистрация: 24.11.2012
Сообщений: 4,391
14.12.2012, 19:27 3
Undefined behavior. Подробнее вырезано
1
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.12.2012, 19:27 4
Ищите инфу по точкам следования: http://alenacpp.blogspot.com/2005/11/sequence-points.html
2
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
14.12.2012, 19:27  [ТС] 5
Avazart, обьясните пожлауйста, чем так кардинально отличается мой и ваш пример, что он на результат влияет(в вашем случае выводится всё по логике вещей).
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 17
14.12.2012, 19:28 6
Собственно как я помню порядок выполнения ++a и a++ не определен в строке
C++
1
std::cout<<a++<<' '<<++a;
Собственно у меня вообще 6 6 выдает, это и есть undefined behavior

Есть такое и Дьюхерсте
1
Oleshko
21 / 21 / 8
Регистрация: 11.12.2012
Сообщений: 64
14.12.2012, 19:32 7
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
std::cout<<a++<<' '<<++a;
по моему, в стандарте не прописано об результате такого действия...
и как оно делается - известно только разработчикам компилятора
1
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 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
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
14.12.2012, 19:48 9
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
выводится не 5 и 7, как по логике должно быть, а выводится 6 и 7.
В принципе должно 6 6(потому что с право налево идем). Хотя не помню как оно в стандарте сказано.
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 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
14.12.2012, 20:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 20:19

Переопределение оператора инкремента
В теле класса &quot;Сlocks&quot; описали: Clocks&amp; operator ++(); // Prefix...

Перегрузка операторов инкремента
Мне надо перегрузить инкримент, я пытался сделать постфиксный и + . Я вродебы...

Операция инкремента и декримента на С++
Смотрите, написал я прогаммку в Ц++, вот отрывок от неё: ...int main () { int...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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