2

我正在关注《C Primer Plus》这本书,遇到了这样一段代码:

// designate.c -- use designated initializers
#include <stdio.h>
#define MONTHS 12
int main(void) 
{
    int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
    int i;

    for (i = 0; i < MONTHS; i++)
        printf("%2d %d\n", i+1, days[i]);

    return 0;
}

当我编译它时它会报告错误:

$ cc designate.c
designate.c:6:57: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
    int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
                                                        ^~
designate.c:6:29: note: previous initialization is here
    int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
                            ^~
1 warning generated.

尽管如此,./a.out工作正常。

$ ./a.out
 1 31
 2 29
 3 0
 4 0
 5 31
 6 30
 7 31
 8 0
 9 0
10 0
11 0
12 0

我很困惑我应该从错误报告中学到什么?

4

2 回答 2

5

虽然警告通常是关于严重问题的,但这只是说你所做的事情没有多大意义,可能是疏忽。具体来说

int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};

在这里,您拥有28元素 1,然后您将其覆盖为29with [1] = 29。所以它28消失了,这就是它警告你的东西。它转化为:

int days[MONTHS] = {31, 29, 0, 0, 31, 30, 31};

从结果中可以看出:

1 31
2 29
3 0
4 0
5 31
6 30

28确实没了。编译器不知道这28对您有多重要,也许它非常重要并且[1] = 29是一个错字。这就是它警告你的原因。而且你也可以看到,3 月和 4 月的日子过得有些古怪0,这肯定不是你想要的。

于 2018-10-16T10:12:55.297 回答
0

好吧,你设置 arr[0]= 31, arr[1] =28 , arr[4]= 31 等等。当您设置 [1] = 29 时,您将 var 重置为 28 到 29 的 arr[1]。

于 2018-10-16T10:17:18.397 回答