Единственный правильный ответ на ваш вопрос: потому что он не определен.
Хорошо, пока вы все не сожгли меня ..
Вы все ответили, почему i+=i++это нормально и логично привести кi=0 .
У меня был соблазн понизить голос за каждый из ваших ответов, но подсчитанная мною репутация была бы слишком высокой ..
Почему я так зол на вас, люди? не из-за чего ваши ответы объясняются ..
Я имею в виду, что каждый прочитанный мною ответ прилагал значительные усилия, чтобы объяснить невозможное, я аплодирую!
Но каков результат? это интуитивный результат - это приемлемый результат?
Каждый из вас видел «голого короля» и каким-то образом принял его за рационального короля.
Вы все НЕПРАВИЛЬНО!
i+=i++;результат 0не определен.
ошибка в механизме оценки языка, если хотите .. или даже хуже! ошибка в дизайне.
хотите доказательства? конечно хочешь!
int t=0; int i=0; t+=i++; //t=0; i=1
Теперь это ... интуитивный результат! потому что мы сначала оценили tприсвоенное ему значение и только после оценки и присвоения у нас произошла операция post - не рационально ли?
это рационально, что: i=i++и i=iдать тот же результат для i?
в то время как t=i++и t=iимеют разные результаты для i.
Операция post - это то, что должно произойти после оценки оператора.
Следовательно:
int i=0;
i+=i++;
Должно быть так же, если мы написали:
int i=0;
i = i + i ++;
и, следовательно, так же, как:
int i=0;
i= i + i;
i ++;
и, следовательно, так же, как:
int i=0;
i = i + i;
i = i + 1;
Любой результат, который не 1указывает на ошибку в компиляторе или ошибку в дизайне языка, если мы идем с рациональным мышлением - однако MSDN и многие другие источники говорят нам: «Эй, это не определено!»
Теперь, прежде чем я продолжу, даже этот набор примеров, которые я привел, никем не поддерживается и не признается. Однако именно так, согласно интуитивному и рациональному подходу, должен был быть результат.
Кодер не должен знать, как пишется или переводится сборка!
Если он написан так, что не будет соответствовать определениям языка - это ошибка!
И в завершение я скопировал это из Википедии, операторов увеличения и уменьшения :
поскольку оператор увеличения / уменьшения изменяет свой операнд, использование такого операнда более одного раза в одном выражении может привести к неопределенным результатам . Например, в выражениях типа x - ++ x не ясно, в какой последовательности должны выполняться операторы вычитания и приращения. Подобные ситуации усугубляются, когда компилятор применяет оптимизации, что может привести к тому, что порядок выполнения операций будет отличаться от того, который предполагал программист.
И поэтому.
Правильный ответ: это НЕ ДОЛЖНО ИСПОЛЬЗОВАТЬСЯ! (как это НЕ УКАЗАНО!)
Да .. - Это имеет непредсказуемые результаты, даже если C # complier пытается как-то его нормализовать.
Я не нашел никакой документации по C #, описывающей поведение, которое вы все описали как нормальное или четко определенное поведение языка. То, что я нашел, - полная противоположность!
[ скопировано из документации MSDN для операторов приращения и убывания Postfix: ++ и - ]
Когда к аргументу функции применяется постфиксный оператор, значение аргумента не обязательно увеличивается или уменьшается до его передачи в функцию. См. Раздел 1.9.17 в стандарте C ++ для получения дополнительной информации.
Обратите внимание, эти слова не гарантированы ...
Простите, если этот ответ кажется высокомерным - я не высокомерный человек. Я просто считаю, что тысячи людей приходят сюда, чтобы учиться, и ответы, которые я читаю, могут ввести их в заблуждение и повредить их логике и пониманию предмета.