在C89 A.1.2.2声明
直接声明符[常量表达式]
在C99 A.2.2声明
直接声明符[type-qualifier-list_opt assignment-expression_opt]
我将assignment-expression_opt
理解为var = 1;
。但是数组并不像int arr[i = 0];
那样声明。C99为什么使用术语";赋值表达式";而不是";常量表达式";这意味着什么?
在C89中,不支持可变长度数组。这意味着数组大小必须在编译时固定。
从C99开始,声明和语句可以在一个块中混合,因此现在可以将必须执行的完整表达式作为初始值设定项。这也是允许创建可变长度数组的原因。
因此,像int arr[i=0];
这样的声明是有效的语法,尽管它是无效的,因为它创建了一个大小为0的数组。int arr[i=2];
是有效的,将创建arr
作为大小为2的int
的数组,并将i
设置为2。
这是因为C99支持VLA,[]
之间的任何内容都可能是任何表达式。
至于为什么它特别说赋值表达式:
在C中描述表达式语法和运算符优先级的方式是,使每个运算符组的语法点位于优先级高于其自身的运算符组。例如,查看赋值表达式的语法:
赋值表达式:
条件表达式
它指向条件?:
运算符,它将是下一个优先级高于赋值运算符的运算符组。
对于优先级最低的逗号运算符,语法实际上是:
表达式:
赋值表达式
表达式,
分配表达式1
也就是说,C中表达式的语法。现在,由于某种原因,C99显然不想在[]
中允许逗号运算符。我不知道为什么——也许这会让限定/静态数组参数声明符太奇怪。因此,他们没有在直接声明符语法中使用表达式,而是选择了逗号运算符上方的下一个运算符组,即赋值运算符。