Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Операторами ++ и + в одной инструкции


Автор: Etar 21.2.2008, 22:04
Здравствуйте.
Вот есть такой код:
Код

        int x = 1;
        x = x + ++ x + x; // здесь будет в C# 5, а в С++ будет 6
        Console.WriteLine(x);
        x = 1;
        x = x + x ++ + x; // здесь в C# и в C++ будет 4
        Console.WriteLine(x);

Какая же последовательность действий при вычислении выражения в первом и во втором случаях?
Попытался разобраться:


x + ++ x + x
сперва должен выполнится оператор ++, так как у него самый высокий приоритет в выражении,
затем остальные операторы слева направо:
x  + 2 + x    // преинкремент увеличивает x на 1 и возвращает увеличенный результат
2 + 2 + x
2 + 2 + 2
= 6 - что и выходит в C++
но в C# выходит 5
выходит, что логика здесь другая, например такая:
сперва извлекается значение из первой переменной x,
затем выполняется оператор ++,
затем извлекается значение из последней переменной x:
1 + ++x + x
1 + 2 + x
1 + 2 + 2
= 5
но тогда как-то странно получается, выходит что существует некая
'операция извлечения значений из переменных', которая имеет одинаковый с постинкрементом приоритет (т.е. самый верхний)  smile 



x + x ++ + x
Здесь же вообще непонятно.
Если по С++ рассуждать, то здесь будет так:
сперва выполнить ++, так как у него самый высокий приоритет среди операторов
затем выполнить остальное слева направо:
x + 1 + x  // постинкремент сперва возвращает текущее значение переменной, затем ее увеличивает
2 + 1 + x
2 + 1 + 2
= 5
но компилятор C++ выдает мне 4, и C# тоже самое
что за ерунда

Объясните пожалуйста!

Спасибо.

Автор: PPS05 21.2.2008, 22:14
Где-то на Винграде уже была такая тема...

Автор: Real 22.2.2008, 00:13
Цитата(PPS05 @ 21.2.2008,  22:14)
Где-то на Винграде уже была такая тема...

Глючит С++


Автор: Crimp 22.2.2008, 01:08
читать тут http://www.progz.ru/forum/lofiversion/index.php/t32777.html
должно сразу навести на правельные мысли, или гугли ешё

Автор: vponomarov 22.2.2008, 11:15
сорри, был не прав:(

Автор: bogys 22.2.2008, 13:03
http://forum.vingrad.ru/forum/topic-175107/hl/sequence+points/index.html#st_0_view_0

Автор: MFSham 22.2.2008, 16:53
Тема точно такая была. Я тоже раньше задавался точно таким же вопросом smile

upd.
вот http://forum.vingrad.ru/topic-142244.html

Автор: Xenon 23.2.2008, 02:05
А по-моему это просто UB smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)