Alg*_*bra 2 c array-initialization designated-initializer
我正在关注"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;
}
Run Code Online (Sandbox Code Playgroud)
它在编译时报告错误:
$ 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.
Run Code Online (Sandbox Code Playgroud)
尽管如此,./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
Run Code Online (Sandbox Code Playgroud)
我在这里很困惑,我应该从错误报告中学到什么?
虽然这些警告通常都是关于严重问题的,但这个问题只是说你所做的事情没有多大意义,可能是一种疏忽.特别
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
Run Code Online (Sandbox Code Playgroud)
在这里,您遇到28的元素1,然后你就覆盖到29同[1] = 29.所以这28已经消失了,这就是它警告你的.它转化为:
int days[MONTHS] = {31, 29, 0, 0, 31, 30, 31};
Run Code Online (Sandbox Code Playgroud)
从结果中可以看出:
1 31
2 29
3 0
4 0
5 31
6 30
Run Code Online (Sandbox Code Playgroud)
该28确实不见了.编译器不知道这28对你有多重要,也许它非常重要并且[1] = 29是一个错字.这就是它警告你的原因.正如你还可以看到的那样,三月和四月有一些0日子还在继续,这肯定不是你想要的.