非静态 2D 数组的正确初始值设定项是什么



Visual Studio 允许:int a[3][3] = { 0 }; 对于局部变量和非静态类变量。但是,GCC 只允许对局部变量执行此操作,但需要 int a[3][3] = { {0} };用于类变量初始化。GCC 是否过于严格或 VS 过于宽松?

#include <iostream>
using namespace std;
class InitArray {
 public:
   InitArray();
   void PrintArray() const;
 private:
   int a[3][3] = { 0 };       // compiles in Visual Studio 2017, but not GCC
                              // modify to = { {0} }; to compile in GCC
InitArray::InitArray() {
   PrintArray();
   for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
         a[i][j] = 1;
      }
   }
}
void InitArray::PrintArray() const {
   for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
         cout << a[i][j] << " ";
      }
      cout << endl;
   }
}
int main() {
   InitArray A;
   A.PrintArray();
   int a[3][3] = {0};          // OK in BOTH compilers
   for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
         cout << a[i][j] << " ";
      }
      cout << endl;
   }
   return 0;
}

您的代码仅内部化数组中的第一个单元格,更改行

int a[3][3] = {0}; 

 int a[3][3] = {1};

并查看输出,只有第一个单元格将为 1,其余单元格为零。

关于编译问题,我正在与 GCC 一起编译,两者都为我编译。初始化类型之间的区别在于

int a[3][3] = {1,2,3,4,5};

会编译,你会得到

1 2 3 
4 5 0 
0 0 0

但 int b[3][3] = {{1,2,3,4}};不会编译,因为

"int [3]"的初始值设定项太多 这是因为 {{}} 只会初始化 a[3][3] 矩阵中的第一个 a[3] 数组。如果你想初始化所有这些,你需要像这样称呼它:

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

最新更新