La única respuesta correcta a su pregunta es: porque no está definida.
Ok, antes de que todos me quemen ...
Todos respondieron por qué i+=i++está bien y es lógico dar como resultado i=0.
Tuve la tentación de rechazar cada una de sus respuestas, pero la reputación que calculé sería demasiado alta.
¿Por qué estoy tan enojado con ustedes? no por lo que explican sus respuestas ...
Quiero decir, cada respuesta que leí había hecho un esfuerzo notable para explicar lo imposible, ¡Aplausos!
¿Pero cuál es el resultado? ¿Es un resultado intuitivo? ¿Es un resultado aceptable?
Cada uno de ustedes vio al "rey desnudo" y de alguna manera lo aceptó como un rey racional.
¡Todos ustedes están EQUIVOCADOS!
i+=i++;El resultado 0es indefinido.
un error en el mecanismo de evaluación del lenguaje si lo desea ... ¡o incluso peor! Un error en el diseño.
quieres una prueba? por supuesto que quieres!
int t=0; int i=0; t+=i++; //t=0; i=1
Ahora esto ... ¡es un resultado intuitivo! porque primero evaluamos lo tasignamos con un valor y solo después de la evaluación y la asignación tuvimos la operación posterior, racional, ¿no?
¿es racional que: i=i++y i=iproduzca el mismo resultado i?
mientras t=i++y t=itienen diferentes resultados para i.
La operación posterior es algo que debería ocurrir después de la evaluación de la declaración.
Por lo tanto:
int i=0;
i+=i++;
Debería ser lo mismo si escribimos:
int i=0;
i = i + i ++;
y por lo tanto lo mismo que:
int i=0;
i= i + i;
i ++;
y por lo tanto lo mismo que:
int i=0;
i = i + i;
i = i + 1;
Cualquier resultado que no 1indique un error en el cumplidor o un error en el diseño del lenguaje si vamos con un pensamiento racional, sin embargo, MSDN y muchas otras fuentes nos dicen "¡Oye, esto no está definido!"
Ahora, antes de continuar, incluso este conjunto de ejemplos que di no es compatible ni reconocido por nadie. Sin embargo, esto es lo que de acuerdo con la forma intuitiva y racional debería haber sido el resultado.
¡El codificador no debe saber cómo se está escribiendo o traduciendo la asamblea!
Si está escrito de una manera que no respetará las definiciones del lenguaje, ¡es un error!
Y para terminar, copié esto de Wikipedia, operadores de incremento y decremento :
dado que el operador de incremento / decremento modifica su operando, el uso de dicho operando más de una vez dentro de la misma expresión puede producir resultados indefinidos . Por ejemplo, en expresiones como x - ++ x, no está claro en qué secuencia se deben realizar los operadores de resta e incremento. Situaciones como esta empeoran aún más cuando el compilador aplica optimizaciones, lo que podría resultar en que el orden de ejecución de las operaciones sea diferente de lo que pretendía el programador.
Y por lo tanto.
¡La respuesta correcta es que esto NO DEBE SER USADO! (ya que no está definido!)
Sí ... - Tiene resultados impredecibles incluso si el cumplidor de C # está intentando normalizarlo de alguna manera.
No encontré ninguna documentación de C # que describa el comportamiento que todos ustedes documentaron como un comportamiento normal o bien definido del lenguaje. ¡Lo que encontré es exactamente lo contrario!
[ copiado de la documentación de MSDN para operadores de incremento y disminución de Postfix: ++ y - ]
Cuando se aplica un operador postfix a un argumento de función, no se garantiza que el valor del argumento se incremente o disminuya antes de pasarlo a la función. Consulte la sección 1.9.17 en el estándar C ++ para obtener más información.
Note esas palabras no garantizadas ...
Perdóname si esa respuesta parece arrogante: no soy una persona arrogante. Solo considero que miles de personas vienen aquí para aprender y las respuestas que leo los engañarán y dañarán su lógica y comprensión del tema.