gpt4 book ai didi

c - 多个未排序的修改警告不适用于结构成员

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:10 24 4
gpt4 key购买 nike

我发现了多个未排序的修改警告的奇怪异常。我在循环计数器时遇到了警告:

int i = 0;
i = ++i & 0xFF; // <- warning

warning: multiple unsequenced modifications to 'i'

我明白为什么这是未定义的行为。但我发现,使用结构成员时不会应用此警告:

typedef struct
{
int i;
}struct_t;

struct_t t;
t.i = ++t.i & 0xFF; // <- no warning

这同样适用于指针:

struct_t *u;
u = &t;
u->i = ++u->i & 0xFF; // <- no warning

我在 C99 模式下使用 MDK-ARM Plus 版本 5.21a。

我的问题是这是否实际上是可接受的代码,出于某种原因,因为我使用的是结构,它不再是未定义的行为,或者是编译器警告只是遗漏了它。

最佳答案

就序列点而言,您的两个示例是相同的。它们都调用未定义的行为(按照 6.5),因为 i 在同一个表达式中被修改了两次,中间没有序列点。 i 的数据类型无关紧要,如果它是结构的一部分也无关紧要。

这是 Not Acceptable 代码。但是,编译器不需要为调用未定义行为的代码提供诊断。如果你确实得到了一个,那么编译器就太好了。

您的编译器在其警告中不一致的原因似乎是一个小的编译器错误。

关于c - 多个未排序的修改警告不适用于结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765826/

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