奇怪的“+ =”行为

时间:2010-10-13 14:20:11

标签: c

此代码段必须返回什么? 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给我???? : - (

5 个答案:

答案 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;

并且+=不像=那样具有传递性。