3
int eye[3][3] = {
  { 1,0,0 },
  { 0,1,0 },
  { 0,0,1 }
};

有没有更短的方法来初始化它?它是如此有规律,以至于必须有一种更智能的方法来初始化它,尤其是如果它超过 3x3,比如 10x10 或更大。

4

4 回答 4

9

中,您可以编写:

int eye[][3] = { [0][0] = 1, [1][1] = 1, [2][2] = 1 };

所有其他元素都归零,而且编译器会为您计算出数组的大小。只是不要跳过第二种尺寸(3)。

顺便提一句。在您的代码中,您不必使用双括号,这也可以:

int eye[3][3] = {
  1,0,0,
  0,1,0,
  1,0,1,
};

中,您还可以保留尾随逗号,只是为了对称和未来的重构

其他解决方案可能需要您编写一些代码,这确实可以为您节省一些时间/空间。但请注意,这种方式您将声明和“初始化”分开,例如在全局变量的情况下会有所作为。

于 2013-05-13T18:50:18.133 回答
6

您可以使用指定的初始化程序

int eye[3][3] = { [0][0]=1, [1][1]=1, [2][2]=1};

根据 C 标准的保证,所有其他元素将被初始化为 0。

于 2013-05-13T18:46:22.177 回答
4

您可以尝试以下方法:

#define SIZE 3
int eye[SIZE][SIZE] = {0};

for (int i = 0; i < SIZE ; ++i)
{
  eye[i][i] = 1;
}
于 2013-05-13T18:46:45.977 回答
1

如果您想将{{ 1,0,0 }, { 0,1,0 }, ...}这种风格的值存储在方阵中,您可以编写如下的简单逻辑。

#define SIZE 3
int eye[SIZE][SIZE] = {0};
int *p = (int *)eye;

for (i = 0; i < (SIZE * SIZE); i = i + (SIZE + 1))
{
    p[i] = 1;   
}

或者

for (i = 0; i < SIZE; i++)
{
    for (j = 0; j < SIZE; j++)
    {
        if (i == j)
        {
            eye[i][j] = 1;          
        }
        else
        {
            eye[i][j] = 0;
        }
    }
}

注意:以上逻辑仅适用于您给出的示例值。因此,如果您的价值观有某种关系,请尝试找到类似的逻辑。如果不是这样,那么即使矩阵的大小是 1000x1000,也没有其他方法可以直接初始化它。

于 2013-05-13T18:47:29.470 回答