Para cambiar a números enteros, A y B, esto parece funcionar en C,
A = A + B - ( B = A);
¿Por qué funciona esto? Y si esto funciona en todas las condiciones, ¿se puede usar para acortar cualquier otro algoritmo comúnmente implementado?
En realidad, invoca un comportamiento indefinido de acuerdo con los estándares.
C99 §6.5: “2. Entre el punto de secuencia anterior y el siguiente, el valor almacenado de un objeto se modificará como máximo una vez mediante la evaluación de una expresión. Además, el valor anterior se leerá solo para determinar el valor que se almacenará.”
No debe confiar en que un código como ese funcione porque se basa en el hecho de que se procesa de izquierda a derecha.
Cualquier implementación que no lo haga así va a hacer que falle.
Debe evitar escribir código que no funcione en todos los casos en todas las plataformas y que no sea independiente del compilador, o que se base en cosas que no estén documentadas o bien definidas.
Entonces, ¿por qué funciona si vas de izquierda a derecha? Supongamos que A = 1 y B = 3
A = A + B - ( B = A);
A = 1 + 3 - (1) = 3
La asignación de B ocurre donde dejé el (). La conclusión es que solo cuando se procesa de izquierda a derecha, la asignación de B a A ocurre más tarde.
Al procesar de derecha a izquierda el mismo ejemplo: A = A + B - ( B = A);
A = 1 + 1 - (1) = 1
Ahora la asignación de B está ocurriendo primero.
Nuevamente, no debe confiar en el código que no está claro para el lector sobre lo que está sucediendo y que depende del compilador, como es el caso aquí.
Esto es solo "más corto" que la forma estándar/obvia de hacerlo, en la cantidad de líneas/puntos y comas utilizados.
Nunca debes usarlo.