En C, ¿qué sucede exactamente si uso () para inicializar una matriz de doble dimensión en lugar de {}?

Cuando inicializo una matriz a[][] :

 int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)}; 

y luego mostrar los elementos de la matriz.

¿Por qué me sale:

 11 89 0 0 0 0 0 0 0 0 

¿Qué sucede si usas llaves en lugar de los primeros paréntesis aquí?

 (8,9,7,67,11) 

es una expresión que utiliza el operador de coma que se evalúa como 11. Lo mismo se aplica al otro inicializador. Por lo tanto, solo inicializa los dos primeros elementos explícitamente, todos los demás se inicializan a 0. Su comstackdor debe advertir sobre un nivel faltante de llaves en el inicializador.

Si utiliza llaves, inicialice las dos matrices de componentes de a , como probablemente se pretende.

  int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)}; 

es equivalente a (en el scope del bloque):

  int a[2][5]={11, 89}; 

, es el operador de la coma C. Evalúa sus operandos de izquierda a derecha y proporciona el valor del operando derecho.

En el ámbito del archivo, los inicializadores de la matriz deben ser constantes y, como la expresión , nunca es una expresión constante, la statement de la matriz no es válida.

Porque no estás usando llaves, sino paréntesis. Usted quiere:

 int a[2][5] = { { 8,9,7,67,11 }, { 7,8,9,199,89 } }; // ^^^ ^^^^^^ ^^^ 

En su código original, acaba de conocer al operador de coma , y en realidad ha escrito int a[2][5] = { 11, 89 }; . Esto es legal, pero inicializa todos los elementos faltantes a cero.

Es el concepto de comma operator de comma operator y comma separator . Debe usar {} para inicializar la matriz.

 int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)}; 

aquí (8,9,7,67,11) es equivalente a 11 debido al comma operator de comma operator y (7,8,9,199,89) es equivalente a 89 para el mismo porque el operador de coma se evalúa de left to right y la más a la derecha valor es el valor devuelto

por lo tanto, es equivalente a a[2][5]={11,89}

pero (8,9,7,67,11),(7,8,9,199,89) pero la coma utilizada en () , () es un comma separator