我发现多个未经检测的修改警告的奇怪例外。循环计数器时我遇到了警告:
int i = 0;
i = ++i & 0xFF; // <- warning
警告:对&#39; i&#39;
进行多次无序修改
我理解为什么这是未定义的行为。我发现虽然在使用struct member时没有应用此警告:
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。
我的问题是这是否是实际可接受的代码,由于某种原因,因为我使用的是结构,它不再是未定义的行为,或者是编译器警告只是缺少它。
答案 0 :(得分:2)
就序列点而言,您的两个示例是相同的。它们都调用未定义的行为(根据6.5),因为i
在同一个表达式中被修改两次,其间没有序列点。 i
的数据类型并不重要,如果它是结构的一部分也不重要。
这是不可接受的代码。但是,编译器不需要为调用未定义行为的代码提供诊断。如果你确实得到了一个,那么编译器非常好。
您的编译器警告不一致的原因似乎是一个次要的编译器错误。