Si ++ (pre / post) tiene mayor prioridad, ¿por qué && se evalúa primero?

Aquí está mi progtwig:

int main(void) { int i, j, k, m; i=-3, j=2, k=0; m = k++ && ++i && ++j; printf("%d, %d, %d, %d\n", i, j, k, m); return 0; } 

La salida del progtwig anterior es:

  -3 2 1 0 

Pero de acuerdo con la tabla de precedencia del operador, ++ debería haber evaluado primero, supongo. También intenté poner paréntesis alrededor de ellos, pero aún así la salida sigue siendo la misma. Leí en alguna parte que poner paréntesis alrededor hará que se evalúe primero, sin importar qué.

Alguien, por favor, que quede claro, cómo se evalúa. Gracias por adelantado.

Estás confundiendo la precedencia con el orden de evaluación . La precedencia definió cómo se agrupan los operandos. La precedencia más alta de ++ hace que la expresión sea equivalente a:

 m = (k++) && (++i) && (++j); 

Pero el orden de evaluación es irrelevante. El circuito de acceso directo de && garantiza que su operando a la izquierda se evalúa primero.

En general, la mayoría de los operadores no especifica el orden de evaluación, con cuatro excepciones: AND lógico && , OR lógico || , ?: operador condicional ?: y operador de coma,.


Como ejemplo concreto de orden de evaluación diferente:

Dado que int i = 0 , el resultado de i + (i++) no está especificado, el comstackdor puede evaluar i++ primero, lo que modifica el valor de i , el comstackdor puede elegir evaluar i primero. Debes evitar expresiones como estas.

Por otro lado, el resultado de i && (i++) se determina, ya que && garantiza que el operando izquierdo i se evalúa primero, ya que es cero, el operando derecho i++ nunca se evalúa.

Lo que está pasando aquí es un cortocircuito. k++ evalúa como 0 , lo cual es falso. Por lo tanto, toda la expresión booleana k++ && ++i && ++j es falsa, por lo que ++i y ++j nunca se ejecutan.