【问题标题】:Multi-dimensional array initialization多维数组初始化
【发布时间】:2015-08-01 18:16:13
【问题描述】:

今天在C++考试中看到一道题:

给定数组int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}的值是多少Multi[1][1][0]

不应该像这样初始化 3 维数组:{{{},{}},{{},{}},{{},{}}}?我怎样才能找到具有这种 indeces 的元素的值?太混乱了。

【问题讨论】:

  • 编译这类代码时你会收到警告。
  • C++ 使用行优先顺序。
  • @Cool Guy,什么类型的警告?
  • @crossover , GCC 给出warning: missing braces around initializer [-Wmissing-braces]warning: (near initialization for 'Multi[0]') [-Wmissing-braces]

标签: c++ c multidimensional-array


【解决方案1】:

您可以通过两种方式初始化数组,但建议使用花括号,因为它可以提高可读性。

查找非大括号格式的多维数组的元素值的最简单方法是拆分数组。例如,您的数组尺寸为 2x3x2:

首先将数组拆分为 2 个集合 (2x3x2)

{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 个集合 (2x3x2)

{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}

现在,如您所见,每个较小的集合 (2x3x2) 中都剩下 2 个元素,因此您已经用大括号格式化了数组。

现在查找索引为[1][1][0] 的元素的值变得更加简单。该元素是第二个 ([1][1][0]) 较大集合的第二个 ([1][1][0]) 较小集合的第一个 ([1 ][1][0]) 元素,所以答案是 1


话虽如此,这样的试题表明你的老师缺乏专业精神,他们更感兴趣的是滥用编程语言语法,而不是教授基本的初始化规则。

【讨论】:

    【解决方案2】:

    应该得到满分的正确答案是:编译代码时启用所有警告,这样你就不会写出这样糟糕的代码了。

    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 等禁止这样做。

    一个好的老师会关心教你如何启用所有编译器警告以及如何正确初始化多维数组,而不是让你解释混淆的无意义代码。

    【讨论】:

      【解决方案3】:

      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}}};

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-04
        • 2011-04-03
        • 2015-07-20
        • 2015-02-26
        • 1970-01-01
        相关资源
        最近更新 更多