Что должен возвращать этот сегмент кода? 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 ???? : - (
Для реального понимания проблемы здесь попробуйте comp.lang.c FAQ статья о точках последовательности .
Это неопределенное поведение, потому что значение a изменяется в этой строке назначений более одного раза.Так что то, что вы можете ожидать, не имеет смысла.
a
Это неопределенное поведение в соответствии со спецификацией 6.5 / 2, поскольку вы изменяете объект более одного раза между точками последовательности:
Между предыдущим и следующим Точка последовательности объекта должна его сохраненное значение изменено в чаще всего по оценке выражение. Кроме того, предшествующий значение должно быть прочитано только для определения значение для хранения.
*f2+=*f1+=a+=2.5;
То же самое старое неопределенное поведение.
Кажется, это переведено на
*f2 += 2; *f1 += 2; a += 2.5;
и что += не так транзитивно, как =.
+=
=