Objective c C语言中花括号的奇怪用法
很抱歉问这么简单的问题,我正在度假,正在读一本关于核心音频的书,但我没有带我的C或Objective C书籍 大括号在这个变量定义中做什么Objective c C语言中花括号的奇怪用法,objective-c,c,initialization,structure,Objective C,C,Initialization,Structure,很抱歉问这么简单的问题,我正在度假,正在读一本关于核心音频的书,但我没有带我的C或Objective C书籍 大括号在这个变量定义中做什么 MyRecorder recorder = {0}; 它根据C99标准将记录器结构的所有成员初始化为0。它似乎用0位初始化结构的每一位。但并非所有编译器都是如此 参见此示例代码 #include<stdio.h> struct s { int i; unsigned long l; double d; }; int
MyRecorder recorder = {0};
它根据C99标准将
记录器
结构的所有成员初始化为0
。它似乎用0
位初始化结构的每一位。但并非所有编译器都是如此
参见此示例代码
#include<stdio.h>
struct s {
int i;
unsigned long l;
double d;
};
int main(){
struct s es = {0};
printf("%d\n", es.i);
printf("%lu\n", es.l);
printf("%f\n", es.d);
return 0;
}
它是。假设
MyRecorder
是一个struct
,这(0
表示整数,NULL
表示指针等)
实际上,这也适用于所有其他数据类型,如int
、double
、指针、数组、嵌套结构等等,以及您可以想象的一切(感谢pmg指出这一点!)
更新:摘自上面链接的网站,引用C99的最终草案:
[6.7.8.21]如果括号内列表中的初始值设定项较少
如果一个集合中有元素或成员,[…]则为该集合的剩余部分
聚合的初始化应与
具有静态存储持续时间
MyRecorder
可能是以下内容之一,您正试图用零初始化其中的所有元素
typedef struct _MyRecorder1 {
int i;
int j;
int k;
}MyRecorder1;
typedef int MyRecorder2[3];
实际上,它不会初始化结构的所有元素,只初始化第一个元素。但是,其他的被自动初始化为0,因为这是C标准要求做的 如果你把: MyRecorder记录器={3}
第一个元素将是3,其他元素将是0。与C++11不同,在C99中,初始值设定项括号中必须至少有一个元素 C++11结构:
MyRecorder recorder{};
C结构:
MyRecorder recorder = {0};
我喜欢将
{0}
称为通用零初始值设定项。它“工作”,递归地,如果需要的话,为每一种类型!int,double,structs,array,pointer,指向structs的指针,带指针数组的structs,…@pmg-为什么你不把你的评论作为答案发表呢?我的评论其实不是答案:它没有解释任何东西,它只是指出了这个结构的另一个用途——以及我给这个结构的名字。还要解释{0}
与{42}
的不同之处,以及它们如何应用于数组、嵌套结构或其他“奇怪”类型,需要一个很长的答案。结构成员没有默认值:最好显式地说零--“将每个成员设置为(正确的)零”。啊!酷。这是有道理的。也可以是标量:MyRecorder={0}
其中MyRecorder
是int
的别名,例如在C@ouah从struct
的名称判断,我认为它不太可能是int
或实际上是结构/联合以外的任何东西。“它将记录器结构的所有成员初始化为0。”正在应用C99标准。“事实上,它用0位初始化结构的每一位。”这只在传统体系结构的实践中是正确的,C99标准多次指出,它并不是说它是正确的,符合标准的编译器/目标体系结构不必使它成为正确的。
MyRecorder recorder = {0};