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



在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显然不想在[]中允许逗号运算符。我不知道为什么——也许这会让限定/静态数组参数声明符太奇怪。因此,他们没有在直接声明符语法中使用表达式,而是选择了逗号运算符上方的下一个运算符组,即赋值运算符。

最新更新