No es capaz de entender el motivo de la salida.

Estoy ejecutando un fragmento de código. Pero no puedo entender el código y la salida que está produciendo.

#include  int main() { int a, b,c, d; a=3; b=5; c=a,b; d=(a,b); printf("c = %d" ,c); printf("\nd = %d" ,d); return 0; } 

La salida de este progtwig es:

 c=3 d=5 

¿No entiendo cómo va la salida?

Considere la precedencia del operador de coma de la C

  1. Cuando tiene una coma, la expresión se evalúa como el parámetro correcto, por eso d=(a,b); se evalúa como d=b .
  2. = tiene una mayor prioridad sobre la coma, por lo que la expresión c=a,b; se evalúa como (c=a),b;

No es parte de la respuesta, pero vale la pena mencionar que todo c=a,b; expresión, se evalúa como b , no a, por ejemplo, si escribe d=(c=a,b); obtienes c=a AND d=b ;

Tenga cuidado de notar que el operador de coma puede estar sobrecargado en C ++. El comportamiento real puede ser muy diferente del esperado.

Como ejemplo, Boost.Spirit usa el operador de coma de manera bastante inteligente para implementar inicializadores de lista para tablas de símbolos. Por lo tanto, hace que la siguiente syntax sea posible y significativa:

 keywords = "and", "or", "not", "xor"; 

Tenga en cuenta que, debido a la prioridad del operador, el código es (¡intencionalmente!) Idéntico a

 (((keywords = "and"), "or"), "not"), "xor"; 

Es decir, el primer operador al que se llama es keywords.operator = (“y”) que devuelve un objeto proxy en el que se invocan los operadores restantes:

 keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");