5

Duplicar posible:
why “++x || ++y && ++z” calculate “++x” firstly ? however,Operator “&&” is higher than “||”precedencia de operadores lógicos en C

Si nos fijamos en la tabla de precedencia C, verá que & & tiene mayor precedencia que ||.

Pero echar un vistazo al siguiente código:

a=b=c=1; 

++a || ++b && ++c; 

printf("%d %d %d\n",a,b,c); 

Se imprime "2 1 1", lo que significa que el "++ un" se evalúa primero, y una vez que el programa ve un VERDADERO allí se detiene allí mismo, porque lo que está al otro lado de la || no es importante.

Pero desde & & tiene mayor precedencia que ||, no debe "++ b & & ++ c" se evalúa en primer lugar, y luego el resultado enchufado de nuevo en "++ un resultado ||"? (en este caso, el programa imprimiría "1 2 2").

+0

Sí, no entendí eso. Gracias por el aviso. –

Respuesta

13

sólo tratar de imaginarlo con paréntesis:

++a || ++b && ++c; 

es igual a

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

que se evalúa de izquierda a derecha.

if & & y || tendría la misma precedencia, se vería como

(++a || ++b) && (++c); 
+0

Buena explicación, gracias. –

0

&& has higher precedence solamente en el árbol de análisis. Pero compilador optimiza el código como

if(!++a) { 
    ++b && ++c; 
} 
+0

Esto no es una optimización. –

+0

¿Cómo es mejor que te llame más? No importa –

+0

La idea de que el cortocircuito es una "optimización" es un malentendido que aparece en SO una y otra vez. En muchos casos, el cortocircuito ** no ** sería la optimización. Por ejemplo, '++ a | ++ b' (sin ramas) es casi seguro más barato de calcular que' ++ a || ++ b' (rama condicional). Lo que es importante darse cuenta es que el cortocircuito no es un comportamiento opcional, y los resultados son diferentes. –

6

Las reglas de precedencia solamente decir que será evaluado de esta manera:

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

Ahora viene el comportamiento de los cortocircuitos de los operadores lógicos que dice que usted tiene que evaluar términos de izquierda a derecha y detener cuando se conoce el resultado. La parte de la derecha nunca se ejecuta.

+0

Gotcha. ¿Puedes darme un ejemplo donde la precedencia de && más || ¿Importa? Gracias –

+0

Importa aquí. Si tuvieran la misma precedencia o si '||' tuviera mayor precedencia, se evaluaría como '(++ a || ++ b) && ++ c', por lo que tanto' ++ a' como '++ c' sería evaluado –

+0

Buen punto. Gracias. –

0

Su ejemplo ++a || ++b && ++c es el mismo que ++a || (++b && ++c).

2

La precedencia y el orden de evaluación son dos cosas completamente diferentes. Para las expresiones lógicas del operador, la evaluación es siempre de izquierda a derecha.La expresión ++a || ++b && ++c se interpreta como

  1. Evaluar ++ un
  2. Si el resultado de 1 es igual a cero, evaluar ++ b & & ++ c

la expresión es analiza como ++a || (++b && ++c) ; la expresión completa es verdadera si cualquiera de las subexpresiones ++a o ++b && ++c es verdadera.

+0

Me di cuenta, y sí, mi confusión era suponer que la precedencia también afectaba el orden de la evaluación. –

Cuestiones relacionadas