2012-05-23 21 views
5

Si la precedencia de & & es mayor que la de ||, ¿no debería este código evaluar primero --b & ++ c, y por lo tanto la salida debería ser 1 2 4 11. Pero aquí parece estar en cortocircuito para dar 1 2 5 10. ¡Por favor ayuda!orden de evaluación de || y & en c

int x; 
int a=1,b=5,c=10; 
x=a++||--b&&++c; 
printf("%d %d %d %d\n",x,a,b,c); 
return 0; 

Respuesta

14

no se debe evaluar el código --b & & ++ c primera

Sin La precedencia de operadores no afecta el orden de evaluación. Sólo significa que

a++||--b&&++c 

se equilvalent a

a++||(--b&&++c) 

lo que es todavía a++ que se evalúa en primer lugar, y por lo tanto cortocircuita el comunicado.

+0

Entonces, ¿cómo sabemos cuándo colocar los corchetes y cuándo no? – Ashwyn

+2

@Ashwyn una buena regla de thum es poner corchetes donde el intento no está claro. En este caso, no es una cuestión de corchetes, IMO es bastante claro lo que sucede. –

+0

@Ashwyn Creo que estás perdiendo el punto. Tiene razón al suponer que && es más ajustado que ||.Pero la expresión aún se evalúa de izquierda a derecha. –

2

La precedencia de && es mayor, lo que significa que se une más a las cosas a la izquierda y derecha que ||. De manera que la expresión es equivalente a

a++ || (--b && ++c) 

|| sólo se evalúa la cosa a la derecha si la expresión de la izquierda se evalúa como no-0. Como a es 1, solo se evaluará a++, y b no se reducirá y c no se incrementará.

2

Sí, && tiene mayor precedencia, sino que sólo determina la agrupación de los operandos, no el orden de evaluación. La operación base aquí es ||, que garantiza que su lado derecho no se evalúa si la izquierda es verdadera, independientemente de las operaciones que estén en el lado derecho.

1

Hay dos conceptos en el trabajo aquí

  1. asociatividad de operadores
  2. compilador de optimización cortocircuito

En C, || el operador se deja asociativo. Como resultado, a ++ se evaluará primero. Dado que el lado izquierdo es VERDADERO, optimización del compilador cortocircuito se asegurará de que el lado derecho de || no se evalúa porque no cambiará el resultado de la expresión.

+0

No tiene nada que ver con optimizaciones o compiladores. El cortocircuito es un comportamiento estándar definido. –

+0

Tiene razón en el sentido de que las optimizaciones del compilador son opcionales, mientras que los cortocircuitos no son opcionales. Pero, intuitivamente, esto es una optimización. Editaré la respuesta. Gracias. –

+0

Mucho más claro! ... –

Cuestiones relacionadas