我偶然发现了一些奇怪的行为,我在网上找不到任何信息.如果我像这样初始化一个布尔数组:
bool condition[10] = {true,[5]=true};
Run Code Online (Sandbox Code Playgroud)
我得到了我期望的输出,第一和第六个值是真的,而其他值是假的.但是,如果我写下面的代码片段:
bool condition[10] = {true,condition[5]=true};
Run Code Online (Sandbox Code Playgroud)
我得到第一,第二和第六个值为真.我认为这是某种未定义的行为,但我希望有一个比我更有知识的人向我解释发生了什么.
我正在编译额外的警告标志,使用GCC和"-std = gnu99",我没有收到任何错误.
oua*_*uah 18
C说:
(C11,6.7.9p23)"初始化列表表达式的评估是相对于彼此不确定地排序的,因此任何副作用发生的顺序都是未指定的."
并在C99
(C99,6.7.8p23)"未指定初始化列表表达式中出现任何副作用的顺序."
这意味着声明
bool condition[10] = {true,condition[5]=true};
Run Code Online (Sandbox Code Playgroud)
可以有相同的行为:
bool condition[10] = {true, 1};
Run Code Online (Sandbox Code Playgroud)
或者作为
bool condition[10] = {true, 1, [5] = true};
Run Code Online (Sandbox Code Playgroud)
无论condition[5] = true
评估的前面或后面做0
阵列成员的初始化.
编辑:在缺陷报告#208中有一个未指定数组元素初始化顺序的情况.情况不同,因为在DR示例中,单个元素有两个初始值设定项.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/9899tc1/n32074.htm
int a [2] = {f(0),f(1),[0] = f(2)};
WG14的意图是,当初始化a时,可以(但不是必须)调用f(0).如果进行了调用,则未指定f(0)和f(2)发生的顺序(f(1)相对于这两者发生的顺序).无论是否进行调用,f(2)的结果用于初始化[0].
小智 10
这是一个不错的小谜题.我想我们得到了它,但更多的解释可能会有所帮助.我认为condition [5] = true 不是指定的初始化程序.它是一个表达式,像往常一样评估为真.由于该表达式位于第二个点,因此true被赋值给条件[1].此外,作为表达式的副作用,条件[5]设置为true.