Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c C语言中花括号的奇怪用法_Objective C_C_Initialization_Structure - Fatal编程技术网

Objective c 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

很抱歉问这么简单的问题,我正在度假,正在读一本关于核心音频的书,但我没有带我的C或Objective C书籍

大括号在这个变量定义中做什么

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};