Si el valor de la variable x
es inicialmente 0, la expresión x += x += 1
evaluará a 2 en C y a 1 en Javascript.¿Por qué (x + = x + = 1) se evalúa de manera diferente en C y Javascript?
La semántica para C me parece obvia: x += x += 1
se interpreta como x += (x += 1)
que es, a su vez, equivalente a
x += 1
x += x // where x is 1 at this point
¿Cuál es la lógica detrás de la interpretación de Javascript? ¿Qué especificación impone tal comportamiento? (Cabe señalar, por cierto, que Java está de acuerdo con Javascript aquí).
Actualización: Resulta que la expresión x += x += 1
ha indefinido comportamiento de acuerdo con el estándar C (gracias ouah, John Bode, DarkDust, Drew Dormann), que parece echar a perder todo el sentido de la pregunta para algunos lectores. La expresión se puede hacer conforme a los estándares insertando una función de identidad en ella de la siguiente manera: x += id(x += 1)
. La misma modificación se puede hacer en el código de Javascript y la pregunta sigue siendo como se indica. Suponiendo que la mayoría de los lectores puedan entender el punto detrás de la formulación "no conforme a los estándares", lo mantendré porque es más conciso.
Actualización 2: Resulta que, según C99, la introducción de la función de identidad probablemente no resuelva la ambigüedad. En este caso, querido lector, considere la pregunta original como C++ en vez de C99, donde "+ =" probablemente ahora sea considerado seguramente como un operador sobrecargable con una secuencia de operaciones definida de manera única. Es decir, x += x += 1
ahora es equivalente a operator+=(x, operator+=(x, 1))
. Perdón por el largo camino hacia el cumplimiento de las normas.
Es una expresión con múltiples efectos secundarios interrelacionados. ¿Por qué eso importa? No escriba código así. –
En JavaScript, toma cero, lo agrega a sí mismo y luego agrega uno. No estoy seguro de qué 'especificación 'hace este comportamiento, pero parece tener sentido para mí leer de izquierda a derecha. – Jasper
@Jasper. El operador + = tiene una asociación correcta. Por lo tanto, debe leerlo de derecha a izquierda, como x + = (x + = 1). Para simplificar, podemos asumir que he puesto esos corchetes allí. –