gpt4 book ai didi

c - 分配评估的顺序(我发现了我的第一个编译器错误吗?)

转载 作者:行者123 更新时间:2023-12-04 11:40:33 25 4
gpt4 key购买 nike

这段代码有一个有趣的错误:

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,这让我有点吃惊。

以下代码片段在所有编译器上都按预期工作:

for (i = 0; 
i < sizeof(struct_array1) / sizeof(struct_array1[0]);
i++)
{
struct_array1[i].value = struct_array2[i].value = 1;
}

现在,我是完全离开这里了,还是有问题的编译器“xcc”只是显示了一个错误?

我在第一个代码片段中找不到任何显示特定于实现的行为的内容;据我了解,后缀递增应该优先于赋值,赋值应该从右到左计算。第一个代码片段应该没有什么奇怪的,除了它有点不可读。

最佳答案

您调用了未定义的行为,因为它修改了 i 并且还出于计算新值以外的目的获取了它的值,没有中间序列点。

C99 标准的相关部分是第 6.5 节中的这个条款:

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.

关于c - 分配评估的顺序(我发现了我的第一个编译器错误吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2370907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com