Precedencia del operador de coma

#include void main(){ int a,b; a=3,1; b=(5,4); printf("%d",a+b); } 

Soy nuevo en C y tengo problemas para entender el progtwig anterior. ¿Alguien puede explicar la salida del progtwig?

El operador de coma evalúa cada una de sus subexpresiones en secuencia, descartando el valor de todas, excepto la subexpresión de la derecha, y evalúa la subexpresión de la derecha.

Este operador tiene la prioridad más baja, más baja que el operador de asignación de hecho. Así que esto:

 a=3,1; 

Es equivalente a:

 (a=3),1; 

Entonces a a se le asigna el valor de 3 , luego se evalúa el valor 1 . La expresión completa tiene el valor 1 , pero este valor se descarta ya que no está asignado a nada.

A diferencia de:

 b=(5,4); 

Los paréntesis hacen que el operador de coma evalúe primero. Entonces, 5 se evalúa y se descarta, luego 4 se evalúa y se asigna a b .

Entonces a tiene el valor 3 y b tiene el valor 4. Entonces el progtwig imprime a+b que es 7 .

Esta statement de expresión

  a=3,1; 

Contiene dos operadores. El primero es el operador de asignación a = 3 que le asigna 3 al segundo operador es el operador de coma. Puedes imaginarlo como ( a = 3 ), 1 . Es decir, tiene dos operandos que son expresiones ( a = 3 ) y 1 . La segunda expresión es el valor del entero literal 1 que no tiene efecto.

Tenga en cuenta que el operador de asignación tiene una prioridad más alta que el operador de coma.

En esta expresion de expresion

  b=(5,4); 

también hay los mismos dos operadores: el operador de asignación y el operador de coma. Pero ahora el operador de coma está entre paréntesis. El valor del operador de coma es el valor de su segundo operando. Así que la expresión con el operador de coma ( 5, 4 ) produce 4 . Este valor se asigna a b .

Y por fin tienes

 printf("%d",a+b); 

que genera la sum de b que es igual a 3 + 4 = 7.

Si lo comstack con la opción -Wall, el comstackdor le avisará:

 test.c: In function 'main': test.c:159:6: warning: right-hand operand of comma expression has no effect [-Wunused-value] a=3,1; ^ test.c:160:7: warning: left-hand operand of comma expression has no effect [-Wunused-value] b=(5,4); ^ 

Esto le explica qué valor se toma como valor de inicio de las variables b .

En este caso a=3 b=4