在下面的示例中,我使用两个结构test1
和来说明这一点test2
。第一个有两个元素 - 一个大小为 2 的整数数组和一个浮点元素。第二个结构有 3 个元素,2 个整数和一个浮点数。
我将test1的两个结构变量s1和s2初始化为:
s1={{23,52},2.5},s2={21,19,3.6};
即使对于s2我已经取出了包围数组元素的大括号,两者都可以正常工作。它可以在没有警告的情况下正常工作,并且输出是正确的。但是当我为test2初始化 2 个变量时,如下所示:
v1={{23,52},2.5},v2={21,19,3.6};
当我尝试打印v1的值时得到不正确的输出,这些是我在编译时得到的警告:
warning: braces around scalar initializer|
warning: (near initialization for 'v1.list1')|
warning: excess elements in scalar initializer|
warning: (near initialization for 'v1.list1')|
||=== Build finished: 0 errors, 4 warnings ===|
基于此前提,请排除以下产生的疑问:
问题:如果使用v1={{23,52},2.5}
而不是v1={23,52,2.5}
让编译器混淆前2个数字是结构的不同整数元素还是结构的整数数组元素的一部分,那么为什么不使用s2={21,19,3.6}
而不是s2={{21,19},3.6}
让编译器认为结构变量s2有3 个元素(2 个整数元素和一个浮点数),而不是2 个元素(一个大小为 2 的整数数组和一个浮点数)?我特别想了解的是为什么关于v1的初始化错误的第一种情况。
#include<stdio.h>
struct test1{
int list[2];
float rate;
}s1={{23,52},2.5},s2={21,19,3.6}; //Works fine
struct test2{
int list1;
int list2;
float rate;
}v1={{23,52},2.5},v2={21,19,3.6}; //Messes things up
int main(void)
{
printf("%d,%d,%f\n",s1.list[1],s2.list[1],s2.rate);
printf("%d,%d,%f\n",v1.list1,v1.list2,v1.rate);
}