我在C中有一个大数组(如果有所不同,则不是C++).我想将所有成员初始化为相同的值.我发誓我曾经知道一个简单的方法来做到这一点.我可以memset()在我的情况下使用,但是没有办法在C语法中构建这样做吗?
在C语言中,如果初始化一个这样的数组:
int a[5] = {1,2};
Run Code Online (Sandbox Code Playgroud)
那么未明确初始化的数组的所有元素将用零隐式初始化.
但是,如果我初始化这样的数组:
int a[5]={a[2]=1};
printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]);
Run Code Online (Sandbox Code Playgroud)
输出:
1 0 1 0 0
Run Code Online (Sandbox Code Playgroud)
我不明白,为什么a[0]打印1而不是0?是不确定的行为?
注意:这个问题是在接受采访时提出的.
我知道在C99中你可以使用成员名称初始化结构的成员,如下所示:
struct myStruct
{
int i;
char c;
float f;
};
Run Code Online (Sandbox Code Playgroud)
以下是有效的:
struct myStruct m = {.f = 10.11, .i = 5, .c = 'a'};
Run Code Online (Sandbox Code Playgroud)
还有人说,未初始化的成员将被设置为0.所以
struct myStruct m = {.f = 10.11, .c = 'a'};
Run Code Online (Sandbox Code Playgroud)
这里i将设置为0
但是,对于以下内容:
struct myStruct m = {.f = 10.11, .c = 'a', 6};
Run Code Online (Sandbox Code Playgroud)
i 仍然初始化为0.如果我们进行这样的复合初始化是什么原因.
考虑以下代码:
int main()
{
int count = 0 ;
int arrInt[2] = { count++, count++ } ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
如果我们使用clang -std=c++03它编译代码,则会产生以下警告(实时示例):
warning: multiple unsequenced modifications to 'count' [-Wunsequenced]
int arrInt[2] = { count++, count++ } ;
^ ~~
Run Code Online (Sandbox Code Playgroud)
我不是在提倡这样的代码,但是在另一个问题中出现了类似的代码,并且对于是否根据标准C ++ 11进行定义存在分歧。在C ++ 11中,根据初始化程序中的多个突变是否列出未定义的行为,此行为是定义良好的行为,并且如果我使用该警告,则该警告消失了。-std=c++11
如果我们看一下C ++ 11 之前的标准草案,它没有覆盖initializer-list的相同语言,那么似乎我们剩下的是Chapter 5 Expressions第4段:
除非另有说明,否则未指定各个运算符的操作数和各个表达式的子表达式的求值顺序以及发生副作用的顺序。57)在上一个序列点与下一个序列点之间,标量对象最多应通过表达式的计算修改其存储值。此外,应仅访问先验值以确定要存储的值。对于完整表达式的子表达式的每个允许的排序,都应满足本段的要求;否则,行为是不确定的。
为了使这个未定义,我们似乎必须将其解释count++, count++ …