Странное поведение "+ =" - PullRequest
3 голосов
/ 13 октября 2010

Что должен возвращать этот сегмент кода? 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 ]

3 голосов
/ 13 октября 2010

Для реального понимания проблемы здесь попробуйте comp.lang.c FAQ статья о точках последовательности .

3 голосов
/ 13 октября 2010

Это неопределенное поведение, потому что значение a изменяется в этой строке назначений более одного раза.Так что то, что вы можете ожидать, не имеет смысла.

3 голосов
/ 13 октября 2010

Это неопределенное поведение в соответствии со спецификацией 6.5 / 2, поскольку вы изменяете объект более одного раза между точками последовательности:

Между предыдущим и следующим Точка последовательности объекта должна его сохраненное значение изменено в чаще всего по оценке выражение. Кроме того, предшествующий значение должно быть прочитано только для определения значение для хранения.

3 голосов
/ 13 октября 2010

*f2+=*f1+=a+=2.5;

То же самое старое неопределенное поведение.

0 голосов
/ 13 октября 2010

Кажется, это переведено на

*f2 += 2;
*f1 += 2;
  a += 2.5;

и что += не так транзитивно, как =.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...