【发布时间】:2010-03-03 11:54:49
【问题描述】:
这段代码有一个有趣的错误:
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)
;
对于大多数编译器,上述代码会导致将相应数组中所有结构的“值”字段设置为 1。 但是,对于一个特定的编译器(我们称之为 xcc), struct_array1 中的结构未正确初始化。所有结构的“值”字段都设置为 0,这让我很惊讶。
以下代码 sn-p 在所有编译器上都按预期工作:
for (i = 0;
i < sizeof(struct_array1) / sizeof(struct_array1[0]);
i++)
{
struct_array1[i].value = struct_array2[i].value = 1;
}
现在,我完全离开这里了吗,还是有问题的编译器“xcc”只是显示了一个错误?
我在第一个代码 sn-p 中找不到任何显示特定于实现的行为;据我了解,后缀增量应该优先于分配,并且分配应该从右到左进行评估。第一个代码 sn-p 应该没有什么奇怪的,只是有点不可读。
【问题讨论】:
-
这不是编译器错误,而是程序员错误:代码涉及未定义的行为,因此是无效的 C
-
我建议你用谷歌搜索未定义的行为。
标签: c c99 undefined-behavior