A única resposta correta à sua pergunta é: Porque ela é indefinida.
Ok, antes que vocês todos me queimem ..
Todos vocês responderam por que i+=i++está correto e lógico resultar i=0.
Fiquei tentado a votar em cada uma das suas respostas, mas a reputação que calculei seria muito alta.
Por que estou tão bravo com vocês? não por causa do que suas respostas explicam.
Quero dizer, todas as respostas que li fizeram um esforço notável para explicar o impossível, aplaudo!
Mas qual é o resultado? é resultado intuitivo - é resultado aceitável?
Cada um de vocês viu o "rei nu" e de alguma forma o aceitou como um rei racional.
Vocês estão todos ERRADOS!
i+=i++;O resultado 0é indefinido.
um bug no mecanismo de avaliação de idiomas, se você quiser .. ou ainda pior! um bug no design.
quer uma prova? claro que você quer!
int t=0; int i=0; t+=i++; //t=0; i=1
Agora isso ... é resultado intuitivo! porque primeiro avaliamos a tatribuição com um valor e somente após a avaliação e a atribuição da operação pós-racional - não é racional?
é racional isso: i=i++e i=iproduzir o mesmo resultado para i?
enquanto t=i++e t=iter resultados diferentes parai .
A pós-operação é algo que deve ocorrer após a avaliação da instrução.
Portanto:
int i=0;
i+=i++;
Deve ser o mesmo se escrevemos:
int i=0;
i = i + i ++;
e, portanto, o mesmo que:
int i=0;
i= i + i;
i ++;
e, portanto, o mesmo que:
int i=0;
i = i + i;
i = i + 1;
Qualquer resultado que não seja 1 indique um erro no complier ou um erro no design da linguagem se formos com o pensamento racional - no entanto, o MSDN e muitas outras fontes nos dizem "ei - isso é indefinido!"
Agora, antes de continuar, mesmo este conjunto de exemplos que dei não é apoiado ou reconhecido por ninguém. No entanto, é isso que, de maneira intuitiva e racional, deveria ter sido o resultado.
O codificador não deve ter conhecimento de como o assembly está sendo escrito ou traduzido!
Se for escrito de uma maneira que não respeite as definições de linguagem - é um bug!
E para finalizar, copiei isso da Wikipedia : Operadores de incremento e decremento :
Como o operador de incremento / decremento modifica seu operando, o uso desse operando mais de uma vez na mesma expressão pode produzir resultados indefinidos . Por exemplo, em expressões como x - ++ x, não está claro em qual sequência os operadores de subtração e incremento devem ser executados. Situações como essa ficam ainda piores quando as otimizações são aplicadas pelo compilador, o que pode resultar na ordem de execução das operações diferente da pretendida pelo programador.
E portanto.
A resposta correta é que isso NÃO DEVE SER USADO! (como é indefinido!)
Sim .. - Tem resultados imprevisíveis, mesmo que o complemento de C # esteja tentando normalizá-lo de alguma forma.
Não encontrei nenhuma documentação do C # descrevendo o comportamento que todos vocês documentaram como um comportamento normal ou bem definido do idioma. O que eu encontrei é exatamente o oposto!
[ copiado da documentação do MSDN para operadores de incremento e decremento do Postfix: ++ e - ]
Quando um operador postfix é aplicado a um argumento de função, não é garantido que o valor do argumento seja incrementado ou decrementado antes de ser passado para a função. Consulte a seção 1.9.17 no padrão C ++ para obter mais informações.
Observe as palavras não garantidas ...
Perdoe-me se essa resposta parecer arrogante - eu não sou uma pessoa arrogante. Eu apenas considero que milhares de pessoas vêm aqui para aprender e as respostas que eu li as enganarão e prejudicarão sua lógica e compreensão do assunto.