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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
BloodyWo1f
Сообщений: n/a
26.06.2013, 19:22     Постфиксный и префиксный декремент #1
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.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++
C++ постфиксный инкремент
Инкремент постфиксный и префиксный - принцип работы C++

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

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

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