From the C Standard (6.5.17 Comma operator)
2 The left operand of a comma operator is evaluated as a void
expression; there is a sequence point between its evaluation and that
of the right operand. Then the right operand is evaluated; the result
has its type and value
So in general this expression statement
a = 1,2,3;
looks like
( a = 1 ), ( 2 ), ( 3 );
(more precisely like ( ( a = 1 ), ( 2 ) ), ( 3 ) that is the expression contains two comma operators)
As the results of evaluation of the expressions ( 2 ) and ( 3 ) are not used the compiler can remove them from the generated object code. Only the expression ( a = 1) has a side effect of changing the variable a.
So the compiler can consider this statement just like
a = 1;
On the other hand if to consider the declaration
int a = ( 1,2,3 );
then here the initializer is an expression with the (two) comma operator. So the declaration is equivalent to
int a = ( ( 1 ), ( 2 ), ( 3 ) );
As the expressions ( 1 ) and ( 2 ) are evaluated as void expressions and do not have side effects the compiler can remove them from the generated object code and consider the declaration like
int a = 3;