En C89 A.1.2.2 Declaraciones
declarador-directo [expresión-constante]
En C99 A.2.2 Declaraciones
declarador-directo [tipo-calificador-lista_opt asignación-expresión_opt]
Entiendo assignment-expression_opt como var = 1; . Pero las matrices no se declaran como int arr[i = 0]; . ¿Por qué C99 usa el término "expresión de asignación" en lugar de "expresión constante" y qué significa?
En C89 no había soporte para matrices de longitud variable. Esto significa que los tamaños de las matrices deben fijarse en el momento de la compilación.
A partir de C99, las declaraciones y sentencias se pueden mezclar dentro de un bloque, por lo que ahora se permiten como inicializador expresiones completas que deben ejecutarse. Esto también es lo que permite crear matrices de longitud variable.
Así que una declaración como int arr[i=0]; es una sintaxis válida, aunque no es válida porque creó una matriz de tamaño 0. int arr[i=2]; es válido y creará arr como una matriz de int de tamaño 2, y establece i en 2.
Esto se debe a que C99 es compatible con VLA y lo que sea que esté entre [] puede ser prácticamente cualquier expresión.
En cuanto a por qué dice expresión de asignación específicamente:
La forma en que se describe la sintaxis de las expresiones y la precedencia de operadores en C es haciendo que la sintaxis de cada grupo de operadores apunte al grupo de operadores con mayor precedencia que él mismo. Por ejemplo, observe la sintaxis de una expresión de asignación:
expresión-asignación:
expresión condicional
Apunta al operador condicional ?: que será el siguiente grupo de operadores con mayor precedencia que los operadores de asignación.
Y para el operador de coma con menor precedencia de todos, la sintaxis es en realidad:
expresión:
expresión-asignación
expresión,asignación-expresión
Es decir, la sintaxis de una expresión en C. Ahora, por alguna razón, C99 aparentemente no quería permitir operadores de coma dentro de [] . No sé por qué, tal vez haría que los declaradores de parámetros de matriz calificada/estática fueran demasiado extraños. Entonces, en lugar de usar expresión en la sintaxis del declarador directo , eligieron el siguiente grupo de operadores por encima del operador de coma, los operadores de asignación.