Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2011, 16:18   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию Префиксная и постпрефиксная операции

Заранее прошу извинение за возможно глупый вопрос через три дня сессия и в попытке освоить то, что не освоил за полугодие, чайник (это то чем я думаю) начинает отказывать. Вопрос такой:
Чему равно значение x после: int y=1, x=++y+1+y++;
Буду коментировать свою логику.
++y (у=2) +1 (у=3) +y(3+3) в итоге х=6 а игрек после постпрефиксной операции равен 7 (тоже ни когда не задумывался но х может быть равно и 7, 1+у выполнено значит у должно увеличется в итоге х равен 7) . Но "правильный" ответ "5". Вообщем мозг запищал и потребовал помощи. Поможете?
Во избижание лишних вопросов компилятор поставить не могу винда тихо умирает
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось atenon; 07.01.2011 в 16:24.
atenon вне форума Ответить с цитированием
Старый 07.01.2011, 16:34   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
1) temp = y; // temp = 1
2) y = y + 1; // y = 2
3) temp = temp + 1; // temp = 2
4) y = y + 1; // y = 3
5) temp = temp + y; // temp = 5
6) x = temp; // x = 5, y = 3
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.01.2011, 16:51   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

5 потому что ты ошибся написал +1 (у=3). у еще не вычеслен окончательно
++у - дает 2
потом +1 - даст три, но у все еще равен 1, поскольку выражение не закончено
далее у++ даст 2 (опять таки у еще равен 1, а 2 всего лишь участник выражения, временное значение)
И потом 3+2 дает 5, а уж теперь 5 помещается в у

Так понятнее? В ходе выражения переменные не изменяются, они рассчитываются, и результат расчета подвыражений живет только в рамках выражения, но не влияет на выходной результат прямо, а лишь становится его причиной
Цитата:
veniside
Прям по Книге Дракона расписал )))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2011, 16:55   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

по нормальному, тут undefined behavior
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 07.01.2011, 17:03   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Цитата:
В ходе выражения переменные не изменяются, они рассчитываются, и результат расчета подвыражений живет только в рамках выражения, но не влияет на выходной результат прямо, а лишь становится его причиной
Понятно !! появлялась такая мысль. Спасибо veniside Stilet
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 07.01.2011, 17:17   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

кстати, у меня плохие новости. Я забыл, что в С вычисляется справа налево. Хотя на результат это не влияет, но точности для:

Код:
x = (++y) + 1 + (y++);
004115C6 8B 45 EC         mov         eax,dword ptr [y] // temp = y
004115C9 83 C0 01         add         eax,1             // temp = temp + 1
004115CC 89 45 EC         mov         dword ptr [y],eax // y = temp
004115CF 8B 4D EC         mov         ecx,dword ptr [y] // temp2 = y
004115D2 8B 55 EC         mov         edx,dword ptr [y] // temp3 = y
004115D5 8D 44 0A 01      lea         eax,[edx+ecx+1]  // temp = temp2 + temp3 + 1
004115D9 89 45 F8         mov         dword ptr [x],eax // x = temp
004115DC 8B 4D EC         mov         ecx,dword ptr [y] // temp2 = y
004115DF 83 C1 01         add         ecx,1            // temp2 = temp2 + 1
004115E2 89 4D EC         mov         dword ptr [y],ecx // y = temp2
Кстати, простейший тест показывает, насколько шизофреничны были создатели С:

Код:
#include "stdafx.h"

using namespace std;

int p(int i, int v) {
	cout << " [" << i << " : " << v << "]";
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int x, y;
	y = 1;
        x = p(0, y) + (++y) + p(1, y) + 1 + p(2, y) + (y++) + p(3, y);
        return 0;
}
Вот, что он печатает:
Цитата:
[3 : 2] [2 : 2] [1 : 2] [0 : 2]
Цитата:
Прям по Книге Дракона расписал )))
Не читал ) Вобще я в С не особо шарю.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.01.2011, 17:28   #7
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Я конечно не гуру програмирования но помоему господин Страуструп завещал инициализировать перемнные
Код:
int p(int i, int v)
Да не вообще не то... как то удивительно выглядит код (был бы от первокурсника прикольно было поржать над глупостью)
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось atenon; 07.01.2011 в 17:32.
atenon вне форума Ответить с цитированием
Старый 07.01.2011, 18:06   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хм.. и что тут по-вашему не инициализировано?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 07.01.2011, 22:14   #9
rangerx
Пользователь
 
Регистрация: 30.05.2009
Сообщений: 46
По умолчанию

Цитата:
Чему равно значение x после: int y=1, x=++y+1+y++;
Не определено. UB другими словами.
Точки следования (sequence points)
rangerx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Операции с циклами Pascaler Помощь студентам 4 03.12.2010 20:37
Битовые операции ("")(Э_Є)("") Общие вопросы C/C++ 4 03.07.2009 19:15