标准秒8.3 / 4说:
当声明符后跟时,也可以省略数组绑定 初始化器(8.5)。
没关系。以下编译正常:
int a[] = {1};
int main()
{
}
但8.3 / 4也说
当几个“数组”规格相邻时,a 创建多维数组;只有第一个常数 可以省略指定数组边界的表达式。
以及
int a[][2];
int main()
{
}
无法编译
但是如果我们在声明者之后添加一个初始化器:
int a[][1] = {{1}};
int main()
{
}
工作正常。虽然标准没有指定多维数组的声明符必须跟一个初始化器。你能解释一下吗?
答案 0 :(得分:5)
你的第一句话中的“也”是指较早的句子:
除了允许不完整对象类型的声明之外,在某些情况下,在函数参数声明(8.3.5)中可能会省略数组绑定。当声明符后跟初始化程序
时,数组绑定可能会被忽略
文本没有明确说明,但意图是数组绑定可能不会被省略,除了:(案例列表)。
代码int a[][2];
不是允许不完整对象类型的声明(例如int a[];
也是非法的)。它不在函数参数的声明中;声明者也不是初始化者。
因此,此代码不属于任何列出允许省略数组绑定的情况。
早先的引用:
只有第一个指定数组边界的常量表达式可以省略
表示第一个之后的边界可能不会被省略。
答案 1 :(得分:0)
你说过
虽然标准没有指定声明者 多维数组必须遵循初始化程序。
这不是真的。多维数组是数组,因此您之前引用的关于省略数组边界的标准声明也适用于它们(带有附加的限制)。