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

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

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

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

26.06.2013, 19:22. Просмотров 1949. Ответов 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++
#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++
В общем, вот код программы 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++
постфиксный, и префиксный экземпляры оператора приращения в чем разница? i++ ++i ??

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
27.06.2013, 12:25     Постфиксный и префиксный декремент #41
@Toshkarik, я не понимаю о почему ты продолжаешь спорить. А хотя понимаю.
Ты не видишь, что UB это неопределённость ПОРЯДКА ДЕЙСТВИЙ, на которые разложит выражение компилятор. Это не генерация рандомного числа, и не гадание процессора на кофейной гуще.
Но ты всё равно утверждаешь, что
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это undefined behaviour. Значит результат может быть каким угодно.
Нет! не каким угодно,
Код вычисления результата может отличаться на разных компиляторах! Но это будет осмысленный код, соответствующий стандарту.

В классическом примере UB i = ++i + ++i; такая неопределённость имеет место, т.к. этот пример может быть понят несколькими способами

способ 1) tmp=i; tmp++; i = tmp; tmp++; i += tmp;
способ 2) tmp=i; tmp++; tmp++; i = tmp + tmp;
возможно ещё способы...

вот в чём выражена неопределённость! а не в "каком угодно" результате.

В нашем примере cout << ( --i )--;
Есть единственный способ разложить это выражение на действия! i--; tmp=i; i--; cout<<tmp; Вот оно! Отсутствие UB! Все действия определены приоритетом операторов.

Заметь: в отличие от примера i=( --i )--;
Который может быть интерпретирован
или так i--; tmp=i; i--; i=tmp;
или так i--; tmp=i; i=tmp; i--;
то есть не определён вид и порядок действий в этой программе! Но поверь, "какого угодно" результата i=абракадабра1234; ты не получишь!
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
27.06.2013, 12:32     Постфиксный и префиксный декремент #42
@Kuzia domovenok,
Нет! не каким угодно,
Код вычисления результата может отличаться на разных компиляторах! Но это будет осмысленный код, соответствующий стандарту.
UB есть ничто иное, как то для чего НЕТУ правил в стандарте. Поэтому среди программистов С и С++ вполне распространены толкования UB как "произойти может что угодно", "в прошлый раз выполняющийся код выпил все пиво в моем холодильнике" и так далее. Это нормально. Понятно, что в действительности, систему программа с UB не отфарматирует, за пивом не сгоняет и т.д., ОДНАКО все отдается на откуп компилятора, как он обработает эту ситуацию и обработает-ли вообще - зависит целиком и полностью от разработчиков компилятора, стандарт умывает руки при UB. Так что не стоит спорить на этот счет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 12:32     Постфиксный и префиксный декремент
Еще ссылки по теме:

не работает префиксный оператор в классе - 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; ...

Перегруженный постфиксный оператор ++ - C++
Есть задание: Создать класс &quot;нота&quot;: название, октава, продолжительность звучания. Производные: &quot;звук&quot; (частота) и &quot;изображение&quot;...

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

Переопределение операции: постфиксный унарный + - C++
Привет. Делаю переопределение операции для стека, нужно сделать постфиксный +, как добавление нового элемента. stack&amp; operator+() { ...


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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
27.06.2013, 12:32     Постфиксный и префиксный декремент #43
@Kuzia domovenok, если честно, то мне уже лень что то писать по этому поводу, пусть каждый останется при своем мнении, я свое никому не навязываю.
Yandex
Объявления
27.06.2013, 12:32     Постфиксный и префиксный декремент
Ответ Создать тему
Опции темы

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