此代码段必须返回什么? 16 16 16对吗?
int main(int argc,char *argv[])
{
int a=2,*f1,*f2;
f1=f2=&a;
*f2+=*f1+=a+=2.5;
printf("%d %d %d\n",a,*f1,*f2);
return 0;
}
奇怪的是,它返回8 8 8给我???? : - (
答案 0 :(得分:3)
*f2+=*f1+=a+=2.5;
相同的旧未定义行为。
答案 1 :(得分:3)
这是未定义的行为,因为a
的值在该分配字符串中被多次修改。所以你可能期望的是没有意义的。
答案 2 :(得分:3)
根据规范6.5 / 2,这是未定义的行为,因为您在序列点之间多次修改对象:
在前一个和下一个之间 序列点一个对象应该 将其存储值修改为 大多数曾经评价一次 表达。此外,先前 值应只读以确定 要存储的值。
答案 3 :(得分:3)
要真正了解此问题,请参阅comp.lang.c FAQ上的sequence points文章。
答案 4 :(得分:0)
似乎它被翻译为
*f2 += 2;
*f1 += 2;
a += 2.5;
并且+=
不像=
那样具有传递性。