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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2015, 14:03   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию Префиксный инкремент

ну почему 10? )) у меня получается 9 и все...

Код:
#include <iostream>
using namespace std;

int main()
{
	setlocale(LC_ALL, "rus");

	int variable = 1;
	int a = 0;

	a = ++variable + 1 + ++variable * 2;

	cout << "a = " << a << endl;

	return 0;
}
Распишете пошагово, пожалуйста: a = ++variable + 1 + ++variable * 2;
marenko.lilia вне форума Ответить с цитированием
Старый 11.05.2015, 14:34   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Так понятней?
a = ++variable + 1 + (++variable * 2);

Чему равно (++variable * 2) и почему?
waleri вне форума Ответить с цитированием
Старый 11.05.2015, 14:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
a = ++variable + 1 + ++variable * 2;
1) ++variable - дает variable = 2
2) ++variable вторая - дает variable = 3
3) variable * 2 дает 2*3=6
4) 3+1+6 дает 10
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 14:40   #4
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

ясно - спасибо
marenko.lilia вне форума Ответить с цитированием
Старый 11.05.2015, 21:07   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Выражение в C++ не обязано считаться слева направо или ещё как-то. Тут undefined behavior.
Цитата:
Сообщение от Stilet Посмотреть сообщение
1) ++variable - дает variable = 2
2) ++variable вторая - дает variable = 3
3) variable * 2 дает 2*3=6
4) 3+1+6 дает 10
Данные рассуждения верны для C# и Java, но не C и C++.
Somebody вне форума Ответить с цитированием
Старый 11.05.2015, 21:41   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
но не C и C++.
и как же это будет на С/С++?

з.ы. это я к тому, что в любом языке есть правила группировки и приоритета операторов, а также правила чтения выражений, поэтому никакого undefined behavior тут быть просто не может.

Последний раз редактировалось f.hump; 11.05.2015 в 22:05.
f.hump вне форума Ответить с цитированием
Старый 11.05.2015, 22:14   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

f.hump, http://en.cppreference.com/w/cpp/language/eval_order:
Цитата:
Order of evaluation of the operands of any C++ operator, including the order of evaluation of function arguments in a function-call expression, and the order of evaluation of the subexpressions within any expression is unspecified (except where noted below). The compiler will evaluate them in any order, and may choose another order when the same expression is evaluated again.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.05.2015, 22:32   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

это, конечно, ужос.

Последний раз редактировалось f.hump; 11.05.2015 в 22:56.
f.hump вне форума Ответить с цитированием
Старый 12.05.2015, 18:49   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

На cppreference ещё мягко сказано про unspecified. В C++11/14 (абзац 1.9.0.15):
Цитата:
Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.
Unsequenced - это ещё круче, чем indeterminately sequenced (unspecified order). Пример из стандарта, тот же абзац:
Код:
f(i = -1, i = -1); // the behavior is undefined
Somebody вне форума Ответить с цитированием
Старый 12.05.2015, 19:40   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Somebody
Да я вообще-то в дизассемблер глянул )
Ну а че нет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инкремент указателя на указатель God_father Общие вопросы C/C++ 11 26.01.2012 12:10
инкремент и for ts-alan Общие вопросы C/C++ 6 25.08.2010 13:57
Инкремент константы в цикле, FASM suicide Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 19.12.2009 21:18
Инкремент и декремент в циклах Nvidia Общие вопросы C/C++ 8 17.10.2009 11:54
Инкремент и дикремент Golovastik Общие вопросы C/C++ 3 16.07.2009 13:39