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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
BloodyWo1f
Сообщений: n/a
#1

Постфиксный и префиксный декремент - C++

26.06.2013, 19:22. Просмотров 2026. Ответов 42
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using std::cout;
int main() 
{
int a=5;
 cout << (--a)-- << " "; 
 cout << a << " ";
 cout << (--a)-- << " "; 
 cout << (--a)-- << " "; 
 cout << a << " ";
system("pause"); 
return 0;
}
Помогите пожалуйста. Не могу понять почему сперва выводит 4 но а=3 потом выводит 2 а потом 0 но а=-1. Почему сначала отнимает 1 а потом 2.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2013, 19:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Постфиксный и префиксный декремент (C++):

Префиксный и постфиксный инкремент - C++
#include &lt;iostream&gt; using namespace std; int main() { int c=0; cout&lt;&lt;с++&lt;&lt;++с&lt;&lt;++с&lt;&lt;с++&lt;&lt;endl; return 0; ...

Как выполняется постфиксный и префиксный инкремент? - C++
Растолкуйте! Обычно, а = с++ толкуется как а = с+1 тогда а = ++с есть а = 1+с Если использовать последнюю запись (а = 1+с),верно...

Инкремент постфиксный и префиксный - принцип работы - C++
Hello World! Нужна ваша помощь, мозг отказывается понимать :wall:! Набрал код: #include &lt;iostream&gt; using namespace std; int...

Потокобезопасен ли префиксный инкремент/декремент? - C++
Потокобезопасен ли префиксный инкремент/декремент? Например такой код: // Объявляем глобальную переменную uint64_t i=0; // Тут...

Поясните как работает постфиксный и префиксный оператор на примере - C++
Здравствуйте. Здесь префиксный понятно, а что если изменить на постфиксный, как код будет работать? vector&lt;int&gt;::size_type...

Постфиксный, и префиксный экземпляры оператора приращения: в чем разница? - C++
постфиксный, и префиксный экземпляры оператора приращения в чем разница? i++ ++i ??

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2013, 23:15 #16
@ValeryS, а я разве где то говорил об точке с запятой? Я никому ничего не навязываю, лишь говорю о том, что написано в стандарте. Хотя в новом стандарте вроде как убрали понятие sequence point
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
26.06.2013, 23:17 #17
@Croessmah,
а вот интересно а так что будет
C++
1
--i--;
и будет ли вообще что то?
у предикремента ведь приоритет выше ?
вопрос чисто академический, ибо так писать не собираюсь
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2013, 23:18 #18
Цитата Сообщение от Croessmah Посмотреть сообщение
В данном случае ЯВНО ЗАДАН ПОРЯДОК изменения
Да причем тут "явно задан порядок" то. При вычислении этого выражения переменная изменяется дважды. Я приводил уже цитату по этому поводу, не я писал стандарт.
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,389
Записей в блоге: 3
Завершенные тесты: 1
26.06.2013, 23:21 #19
Цитата Сообщение от ValeryS Посмотреть сообщение
у предикремента ведь приоритет выше ?
у постфиксного выше
http://ru.cppreference.com/w/cpp/lan...tor_precedence
а значит имеем прединкремент временной переменной

Добавлено через 42 секунды
Цитата Сообщение от Toshkarik Посмотреть сообщение
При вычислении этого выражения переменная изменяется дважды.
Вот тут UB, ибо порядок
(--a) + (a--)
не задан
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2013, 23:23 #20
@ValeryS, этот код не должен компилироваться.
0
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
26.06.2013, 23:27 #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
При вычислении этого выражения переменная изменяется дважды.
и что?
на следующей строчке все в порядке будет
ведь мы здесь не присваиваем
или компилятор выбросит одно уменьшение?

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
у постфиксного выше
всегда думал наоборот
тогда действительно ерунда получается
Не будем так писать
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
26.06.2013, 23:28 #22
Цитата Сообщение от Toshkarik Посмотреть сообщение
При вычислении этого выражения переменная изменяется дважды.
И что, что изменяется дважды? Вот ты что-то споришь всё, утверждая:
Цитата Сообщение от Toshkarik Посмотреть сообщение
Результат может быть каким угодно.
А давай начнём с того, что при UB программа генерирует не какое-то рандомное значение -12345, а некую последовательность действий, которая для некоторых компиляторов разная, т.к. стандарт не описывает точное поведение в этих случаях.
Так вот ты утверждаешь, что эту программу возможно интерпретировать каким-то иным образом, кроме
Цитата Сообщение от ValeryS Посмотреть сообщение
идет уменьшение
потом вывод на экран ( в поток) вот она точка следования
и потом еще раз уменьшение
Можно поинтересоваться, какие тут могут быть альтернативные действия?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2013, 23:29 #23
@Croessmah, да дело уже даже не в порядке, а в
Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.
В данном случае ( --i )-- это и есть expression и в нем не соблюдается value modified at most once, уже и не знаю, что еще добавить, и как еще написать.
0
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
26.06.2013, 23:35 #24
при
C++
1
cout<< ++i + ++i ;
будет 4,
а значение i=2.
(т.е. сначала выполнятся 2 раза ++, а потом сложатся)

при
C++
1
cout<< i++ + i++;
выведется 0, i = 2;

при
C++
1
cout << ++i + i++;
выведется 2, i =2

делайте простые выводы
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,389
Записей в блоге: 3
Завершенные тесты: 1
26.06.2013, 23:41 #25
Цитата Сообщение от razor_ua Посмотреть сообщение
делайте простые выводы
а теперь сделайте так:
C++
1
(i++ - i++)
на разных компиляторах получите разные ответы.
А у Вас получались одинаковые, потому что хоть задом наперед все сделай, все равно будет одинаковый ответ. А вот при разности, ну или при разных подвыражениях будет бо-бо...
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.06.2013, 23:52 #26
@Kuzia domovenok, я не занимаюсь исследованием компиляторов, мне это не к чему. Возможно, что все существующие компиляторы оценят это выражения так, как описано в теме. Но это ничего не меняет по отношению к стандарту.

И да, это утверждение не верно:
Цитата Сообщение от ValeryS
потом вывод на экран ( в поток) вот она точка следования
и потом еще раз уменьшение
std::cout << ( --i )--; раскрывается компилятором как cout.operator<<(( --i )--);, следовательно оно должно быть вычислено до вызова функции. В момент вызова функции постдекремент уже выполнен, а в функцию передается копия.

@razor_ua, мда, тут все понятно...
0
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
26.06.2013, 23:55 #27
мда.... при ВЫЧИТАНИИ сначала выполняется ++ 2 раза, пофиг с какой стороны, и выводится результат отнимания..

а при сложении только 1 инкремент...
теперь ночью будут кошмары сниться )))
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,389
Записей в блоге: 3
Завершенные тесты: 1
26.06.2013, 23:57 #28
Цитата Сообщение от Toshkarik Посмотреть сообщение
Но это ничего не меняет по отношению к стандарту.
Что же Вы одно предложение выдернули то из стандарта?
Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified(53)
Between the previousand next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. F
и еще сноска внизу:
(53)The precedence of operators is not directly specified, but it can be derived from the syntax.
То бишь никакого UB, если порядок может быть получен из синтаксиса
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
27.06.2013, 00:00 #29
Цитата Сообщение от Toshkarik Посмотреть сообщение
std::cout << ( --i )--; раскрывается компилятором как cout.operator<<(( --i )--);, следовательно оно должно быть вычислено до вызова функции. В момент вызова функции постдекремент уже выполнен, а в функцию передается копия.
Это ты типа доказываешь, что "то утверждение неверно"?
Больше похоже наоборот, на подтверждение слов @Croessmah
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,389
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 00:08 #30
@Toshkarik, UB происходит в данных случаях от того, что в разных компиляторах дерево строится по разному и все зависит от того, в каком порядке это дерево "обходится", а это зависит от реализации. А значит нет однозначного ответа в каком порядке будут выполнены подвыражения. В случае с (--a)-- скобки влияют на построение дерева таким образом, что выполнить по другому просто не получится
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 00:08
Привет! Вот еще темы с ответами:

Указатели: почему так происходит? Постфиксный и префиксный инкремент - C++
В общем, вот код программы double q; for (int i(0);i&lt;10;i++) { q=i; } cout&lt;&lt;q&lt;&lt;endl; double* d=q; cout&lt;&lt;d&lt;&lt;&quot;...

не работает префиксный оператор в классе - C++
Проблема : не работает &quot;++plus&quot; в &quot;void ClassB::count()&quot; Есть вариант решить это так : поменять &quot;private&quot; на &quot;protected&quot; в обоих классах...

постфиксный инкремент - C++
class Inkrement { Inkrement(){}; Inkrement &amp;operator++(int) { Inkrement temp = *this; ++*this; return temp; ...

Указатель на постфиксный инкремент x - C++
Почему так нельзя делать? int *p = &amp;(x++); Вроде же все ясно должно быть компилятору


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

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

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