Esta tarde, realmente no sé qué estaba haciendo con los operadores y C. Eventualmente, escribí un código que pensé que no se compilaría, pero no sé cómo funcionó.
El código es:
#include <stdio.h> int main() { int n=2; int sum = n + - + - + - + n; /* This line */ printf("%d\n", sum); return 0; }Y la salida es:
0
Estoy completamente confundido sobre cómo se compiló el código y qué sucede detrás de escena.
¿Cómo funciona la línea int sum = n + - + - + - + n; ¿trabaja?
Todos menos el primero son operadores unarios .
n + - + - + - + nes equivalente a
n + (-(+(-(+(-(+n))))))que a su vez es simplemente igual a
n + (-n)después de resolver todos los operadores unarios.
-n es, por supuesto, una negación ordinaria; +n esencialmente no hace nada (aunque tiene el efecto secundario de forzar la promoción integral).
int sum = n + - + - + - + n; /* buuuuuu */ /* Order: 7 6 5 4 3 2 1 */es equivalente a:
n + (-(+(-(+(-(+n)))))); o simplemente n + (-n)
Tenga en cuenta que los operadores unarios se unen más estrechamente que los operadores binarios en C opeartor precedance table y la asociatividad del operador unario +- es de derecha a izquierda, mientras que los operadores binarios +- son de izquierda a derecha.
Tanto + como - también son operadores unarios. El resultado de +n es el valor (promocionado) de n . El resultado de -n es el negativo de (promocionado) n .
n + - + - + - + n;es equivalente a:
n + (-(+(-(+(-(+n)))))) que es básicamente n + (-n) suponiendo que no ocurra un desbordamiento.