Єдина відповідь на ваше запитання, яка є правильною, - це тому, що вона не визначена.
Добре, перш ніж ви мене спалите ..
Ви всі відповіли, чому i+=i++
це нормально і логічно це призвести i=0
.
Я спокусився проголосувати за кожну 1 вашу відповідь, але врахування репутації, яку я підрахував, буде занадто високою.
Чому я так злий на тебе людей? не тому, що пояснює Ваша відповідь.
Я маю на увазі, кожна відповідь, яку я прочитав, робила неабиякі зусилля, щоб пояснити неможливе, я оплесками!
Але який результат ?? це інтуїтивний результат - чи прийнятний результат ??
Кожен з вас бачив "голого царя" і якось сприймав його як раціонального царя.
Ви всі НЕПРАВИЛЬНІ!
i+=i++;
результат 0
не визначений.
помилка в механізмі оцінювання мови, якщо ви .. чи ще гірше! помилка в дизайні.
хочете доказ? звичайно, ти хочеш!
int t=0; int i=0; t+=i++; //t=0; i=1
Тепер це ... інтуїтивно зрозумілий результат! тому що ми спершу оцінили t
присвоєне йому значення і лише після оцінки та присвоєння у нас відбулася поштова операція - раціонально чи не так?
чи раціонально це: i=i++
і i=i
дати такий же результат i
?
в той час t=i++
і t=i
мають різні результатиi
.
Операція публікації - це те, що повинно відбутися після оцінки твердження.
Тому:
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 та багато інших джерел говорять нам "ей - це не визначено!"
Тепер, перш ніж продовжувати, навіть цей набір прикладів я не підтримував і не визнавав ніхто. Однак це, згідно інтуїтивному та раціональному способу, повинно було бути результатом.
Кодер не повинен знати про те, як пишеться або перекладається збірка!
Якщо це написано таким чином, що не буде поважати мовних визначень - це помилка!
І для закінчення я скопіював це з операторів Wikipedia, Increment і decrement :
Оскільки оператор збільшення / зменшення модифікує свій операнд, використання такого операнда більше одного разу в одному і тому ж виразі може давати невизначені результати . Наприклад, у таких виразах, як x - ++ x, незрозуміло, в якій послідовності слід виконувати оператори віднімання та збільшення. Такі ситуації ще більше погіршуються, коли компілятор застосовує оптимізацію, що може призвести до того, що порядок виконання операцій буде іншим, ніж те, що планував програміст.
І таким чином.
Правильна відповідь полягає в тому, що ЦЕ ПОТРІБНО НЕ ВИКОРИСТОВУЄТЬСЯ! (як це НЕ ВИЗНАЧЕНО!)
Так .. - Він має непередбачувані результати, навіть якщо компілятор C # намагається якось його нормалізувати.
Я не знайшов жодної документації на C #, яка б описувала поведінку всіх вас, задокументованих як нормальну або чітко визначену поведінку мови. Що я знайшов - це навпаки!
[ скопійовано з документації MSDN для операторів збільшення та скорочення Postfix: ++ та - ]
Коли до аргументу функції застосовується оператор postfix, значення аргументу не гарантується збільшення або зменшення, перш ніж воно буде передане функції. Додаткову інформацію див. У розділі 1.9.17 стандарту C ++.
Зауважте, що ці слова не гарантовані ...
Пробачте, якщо ця відповідь здається зарозумілою - я не зарозуміла людина. Я просто вважаю, що тисячі людей приходять сюди, щоб дізнатися, і відповіді, які я читаю, введуть їх в оману і завдадуть шкоди їхній логіці та розумінню теми.