Chr*_*fer 2 c c99 undefined-behavior
这段代码有一个有趣的bug:
some_struct struct_array1[10] = {0};
some_struct struct_array2[10] = {0}
int i;
for (i = 0;
i < sizeof(struct_array1) / sizeof(struct_array1[0]);
struct_array1[i].value = struct_array2[i++].value = 1)
;
Run Code Online (Sandbox Code Playgroud)
对于大多数编译器,上面的代码导致将相应数组中所有结构的"value"字段设置为1.但是,对于一个特定的编译器(让我们称之为xcc),struct_array1中的结构未正确初始化.对于所有结构,"value"字段设置为0,这让我感到惊讶.
以下代码段在所有编译器上按预期工作:
for (i = 0;
i < sizeof(struct_array1) / sizeof(struct_array1[0]);
i++)
{
struct_array1[i].value = struct_array2[i].value = 1;
}
Run Code Online (Sandbox Code Playgroud)
现在,我完全离开这里,还是有问题的编译器"xcc"只是显示错误?
我在第一个代码片段中找不到任何显示特定于实现的行为的内容; 根据我的理解,后缀增量应该优先于赋值,并且应该从右到左评估赋值.第一个代码片段应该没什么奇怪的,除了它有点不可读.
您已调用未定义的行为,因为它修改i并获取其值而不是计算新值,而没有插入序列点.
C99标准的相关部分是第6.5节中的该条款:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
struct_array1[i].value = struct_array2[i++].value = 1
我认为这是未定义的行为,因为i++不能保证在达到下一个序列点之前完成所有副作用.下一个序列点是;语句末尾的"虚构" .这是一个常见的陷阱,我认为你可以找到关于SO的很多主题,只搜索序列点.