我今天在C ++考试中看到了一个问题:
鉴于数组 int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
, Multi[1][1][0]
的价值是什么?
不应该像这样初始化三维数组:{{{},{}},{{},{}},{{},{}}}
?如何找到具有此类indeces的元素的值?这太令人困惑了。
答案 0 :(得分:62)
您可以通过两种方式初始化数组,但建议使用卷曲内括号,因为它会提高可读性。
查找未使用大括号格式化的多维数组元素值的最简单方法是拆分数组。例如,数组的尺寸为2x3x2:
首先将数组拆分为 2 集( 2 x3x2)
{14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}}
然后将每组分成 3 组(2x 3 x2)
{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}
现在,如您所见,每个较小的一组(2x3x 2 )中都有 2 元素,因此您已使用大括号格式化数组。
现在找到索引为[1][1][0]
的元素的值更简单。这个元素是第二个([ 1 ] [1] [0])较大的集合的第二个([1] [ 1 ] [0])较小的集合的第一个([1] ] [1] [ 0 ])元素,所以答案是 1 。
话虽如此,这样的考试问题表明你的老师缺乏专业性,他对滥用编程语言语法更感兴趣,而不是教授基本的初始化规则。
答案 1 :(得分:23)
应该产生满分的正确答案是:编译代码并启用所有警告,你最终不会写这样糟糕的代码。
gcc test.c -std=c11 -pedantic-errors -Wall -Wextra
test.c: In function 'main':
test.c:6:3: warning: missing braces around initializer [-Wmissing-braces]
int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2};
^
然而,我怀疑你的老师不是那么关心代码是垃圾,而是在寻找C语言中的细节,它允许初始化数组(和结构),即使括号列表不匹配正在初始化的结构。
就C语言而言,int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
完全等同于:
// properly written initialization list for a 3D array
int Multi[2][3][2] =
{
{
{14, 11},
{13, 10},
{ 9, 6}
},
{
{ 8, 7},
{ 1, 5},
{ 4, 2}
}
};
仅允许第一个表单被允许的原因是因为它允许你编写像
这样的东西int Multi[2][3][2] = {0};
将第一个元素显式初始化为0,其余元素显式初始化为静态存储持续时间(0)。意味着所有元素都将设置为零。
写int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
之类的东西正在滥用C语言。这是非常糟糕的做法。这样做是由MISRA-C等禁止的。
一位好老师会关心如何启用所有编译器警告以及如何正确初始化多维数组,而不是让你解释混淆的无意义代码。
答案 2 :(得分:2)
int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};
Multi [2] [3] [2]的存储器映射是 - >
多[0] [0] [0] = 14;
多[0] [0] [1] = 11;
多[0] [1] [0] = 13;
多[0] [1] [1] = 10;
多[0] [2] [0] = 9;
多[0] [2] [1] = 6;
多[1] [0] [0] = 8;
多[1] [0] [1] = 7;
多[1] [1] [0] = 1;
多[1] [1] [1] = 5;
多[1] [2] [0] = 42;
多[1] [2] [1] = 2;
因此Multi [1] [1] [0]的值= 1;这很简单
我们也可以像这样初始化
int Multi [2] [3] [2] = {{{14,11},{13,10},{9,6}},{{8,7},{1,5},{ 4,2}}};