1

我不小心用这些而不是通常使用的大括号覆盖了数字并得到“2 4 0 0”。为什么会发生这种转变?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
    int a[2][2]={(1,2),(3,4)};
    for (int i = 0; i < 2; ++i)
    {
        /* code */
        for (int j = 0; j < 2; ++j)
        {
            /* code */
            printf("%d ",a[i][j] );
        }
    }
    return 0;
}
4

2 回答 2

1

在此声明中列表初始化的大括号中

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

现在有两个表达式( 1, 2 )( 3, 4 )。它们是带有逗号运算符的主要表达式。

根据 C 标准(6.5.17 逗号运算符)

2 逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有它的类型和值

所以表达式的值为24

因此实际上你有

int a[2][2]={ 2, 4 };

结果,数组的第一个子数组即数组 a[0] 使用这些值初始化。第二个子数组 a[1] 的元素被初始化为零。

例如,如果你会写

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

那么这个声明相当于

int a[2][2]={ 4 };

并且只有元素a[0][0]将由 value 显式初始化4

使用带有逗号运算符的表达式作为初始值设定项的另一个示例。

int i = 0;
int j = ( i++, i++, i++ );

结果i将等于3和。j2

于 2021-12-04T11:22:08.687 回答
0

您不小心使用了逗号运算符。在您的情况下,它什么也没做,但它的结果值是逗号分隔列表(1,2)中的最后一个值:导致最后一个值2(3,4)导致4.

所以你的代码相当于:

int a[2][2]={2,4};

未提供四个值中的最后两个a,因此它们被隐式初始化为零。这篇文章确切地解释了原因。

于 2021-12-04T11:10:25.183 回答