如果将f0
和f1
打包进同一个字节的实现方式,那么下面的程序是否被定义了呢?
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
我对C99和C11的答案感兴趣,如果有理由认为它们不同,请提供各自的答案。
在C99中,我找到的是6.5:2:
在上一个序列点和下一个序列点之间,一个对象通过表达式的计算至多被修改一次其存储的值。 [...]
对于我来说,这段话对上面的程序有什么后果并不清楚。
基于大量的随机测试,大多数编译器似乎会生成代码,使得这两个赋值语句不会相互干扰。