C中数组括号中的赋值表达式是什么?

What is the assignment-expression in array brackets in C?

在 C89 A.1.2.2 声明中

direct-declarator [ constant-expression ]

在 C99 A.2.2 声明中

direct-declarator [ type-qualifier-list_opt assignment-expression_opt ]

我理解 assignment-expression_optvar = 1;。但是数组没有像 int arr[i = 0]; 那样声明。为什么 C99 使用术语“赋值表达式”而不是“常量表达式”,这是什么意思?

C89 不支持变长数组。这意味着数组大小必须在编译时固定。

从 C99 开始,声明和语句可以混合在一个块中,因此现在允许将必须执行的完整表达式作为初始化程序。这也是允许创建可变长度数组的原因。

所以像 int arr[i=0]; 这样的声明是有效的语法,尽管它是无效的,因为它创建了一个大小为 0 的数组。int arr[i=2]; 是有效的并且将创建 arr 作为 int 大小为 2,并将 i 设置为 2.

这是因为 C99 支持 VLA 并且 [] 之间的任何内容都可以是几乎任何表达式。

至于为什么具体说assignment-expression

在 C 中描述表达式语法和运算符优先级的方式是让每个运算符组的语法指向优先级高于自身的运算符组。例如,查看赋值表达式的语法:

assignment-expression:
conditional-expression

它指向条件运算符?:,它将是下一个运算符组,其优先级高于赋值运算符。

对于所有优先级最低的逗号运算符,语法实际上是:

expression:
assignment-expression
expression , assignment-expression

也就是 C 中表达式的语法。现在出于某种原因,C99 显然不想在 [] 中使用逗号运算符。我不知道为什么 - 也许它会使 qualified/static 数组参数声明符太奇怪了。因此,他们没有在 direct-declarator 语法中使用 expression,而是选择了逗号运算符上方的下一个运算符组,即赋值运算符。