C语言中的布尔数组初始化

C语言中的布尔数组初始化,c,arrays,C,Arrays,我偶然发现了一些奇怪的行为,我在网上找不到任何信息。如果我像这样初始化布尔数组: bool condition[10] = {true,[5]=true}; 我得到了预期的输出,第一个和第六个值为真,而其他值为假。但如果我写下以下片段: bool condition[10] = {true,condition[5]=true}; 我得到第一、第二和第六个值为真。我认为这是一种未定义的行为,但我希望有比我更了解情况的人向我解释发生了什么 我使用GCC和“-std=gnu99”使用额外的警告

我偶然发现了一些奇怪的行为,我在网上找不到任何信息。如果我像这样初始化布尔数组:

 bool condition[10] = {true,[5]=true};
我得到了预期的输出,第一个和第六个值为真,而其他值为假。但如果我写下以下片段:

 bool condition[10] = {true,condition[5]=true};
我得到第一、第二和第六个值为真。我认为这是一种未定义的行为,但我希望有比我更了解情况的人向我解释发生了什么

我使用GCC和“-std=gnu99”使用额外的警告标志进行编译,没有收到任何错误。

C说:

(C11,6.7.9p23)“初始化列表表达式的计算彼此之间的顺序不确定,因此未指定任何副作用发生的顺序。”

在C99中

(C99,6.7.8p23)“未指定初始化列表表达式中出现任何副作用的顺序。”

这意味着宣言

    bool condition[10] = {true,condition[5]=true};
可以具有相同的行为:

    bool condition[10] = {true, 1};
或作为

是否在数组成员的
0
初始化之前或之后执行
条件[5]=true
求值

编辑:缺陷报告#208中存在数组元素未指定初始化顺序的情况。情况有所不同,因为在DR示例中,单个元素有两个初始值设定项

inta[2]={f(0),f(1),[0]=f(2)}

WG14的意图是,在初始化a时可以(但无需)调用f(0)。如果进行调用,则未指定f(0)和f(2)的发生顺序(正如f(1)相对于这两个的发生顺序)。无论是否进行调用,f(2)的结果都用于初始化[0]


这是一个很好的小谜题。我想ouah明白了,但更多的解释可能会有所帮助。我认为条件[5]=true不是指定的初始值设定项。它是一个表达式,其计算结果通常为true。由于该表达式位于第二个位置,因此将true指定给条件[1]。此外,作为表达式的一个副作用,条件[5]被设置为true。

表达式的值可用于C99中的初始值设定项<代码>条件[5]在这个时间也可用。是的,但它不应该只翻转第二个值并停在那里吗?为什么它会翻转到第六个或我在上面指定的任何值(好像我正在键入{true,条件[5],[5]=true})?同样,您显式地设置了条件[5]=true。。。这就是为什么这是真的。您还可以通过使用真值初始化条件[1]将其设置为真。“在我看来,例如if和ELSE似乎是同时被执行的。”——不,你只是没有清楚地思考这个问题。正如ouah所解释的,条件[5]的设置可以在数组初始化之后发生(就像您的情况一样),也可以不发生。。。我明白了,基本上条件[5]=true是将第一个值设置为true,然后执行它应该执行的操作。谢谢,我想我需要喝早茶才能正常工作<代码>条件[5]=true是一个赋值。它将值
true
分配给
条件[5]
。它还生成值
true
,该值用于初始化
条件[1]
。确定后回答该问题。还有一个问题,为什么条件[5]=true被计算了两次?我认为你们的引用只适用于所有初始值设定者之间的副作用,而不适用于这些影响相对于初始化本身的顺序?想冒险猜测一下
condition[10]={true,condition[0]=false}
?我认为@KerrekSB是正确的:没有明确说明是先计算
true
还是
condition[5]=true
,但因为它们彼此不影响,所以这并不重要<代码>[0]将被设置为
true
[1]
将被设置为
条件[5]=true
的结果,并且作为表达式赋值时,
[5]=true
发生在
[1]=true
之前,以及
[0]=true
在此之前或之后。@JimBalter Right,在这种情况下,结果可能是未知的。
    bool condition[10] = {true, 1, [5] = true};