【发布时间】:2014-04-16 06:53:00
【问题描述】:
我对 C/C++ 编译器的了解是,它们在初始化多维数组时会忽略内括号。
所以,你不能这样做:
int myArray[][] = { { 2, 3 }, { 4, 5 }, { 4, 1 } };
因为编译器会看到它完全一样
int myArray[][] = { 2, 3, 4, 5, 4, 1 };
现在它不知道是 6 * 1、3 * 2、2 * 3、1 * 6,还是别的什么(因为这可以是部分初始化列表,不一定完整)。
我的问题是,为什么这在许多编译器中都有效?
int myArray[][2] = { { 2 }, { 4, 5 }, { 4, 1 } };
编译器“直观地”将其视为:
int myArray[][2] = { { 2, 0 }, { 4, 5 }, { 4, 1 } };
这意味着它不会忽略大括号。到目前为止,我已经在三种不同的编译器上进行了尝试,并且都可以正常工作。
我希望答案是“这只是依赖于编译器”。我无权访问该标准,因此请提供来自该标准的答案。我不需要直觉,我有我的。
【问题讨论】:
-
open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf(这是两个“几乎发布”的 C++11 标准之一 - 最终版本仅包含编辑更改 AFAIK)
-
只有 C 和/或 C++ 标准的作者才能知道这个问题的答案。
-
@MatsPetersson:这不是真的。这将使标准几乎毫无用处。
-
呃,我误解了这个问题,我以为是“为什么我们不能让编译器根据我写的内容确定大小”。
-
你不能做第一个例子的原因是你不能像那样声明一个多维数组。只有“最左边”的维度可以省略其大小。
标签: c++ c multidimensional-array initialization