传媒行业研究报告:帮我解释一下这个程序

来源:百度文库 编辑:高考问答 时间:2021/01/16 10:53:20
main()
{union exx
{int a,b;
struct
{int c,d;}lpp;
}e={10};
e.b=e.a+20;
e.lpp.c=e.a+e.b;
e.lpp.d=e.a*e.b;
printf("%d,%d\n",e.lpp.c,e.lpp.d);
}
结果输出60,3600
而我认为应该输出40,300。这里的10不是赋给e.a吗?

e 有2个int的宽度 因为lpp 宽度为2 所有整体宽度为2
e.a,e.b,e.lpp.c 都在一个空间内,只有lpp.d 是和他们不同的
每一个操作语句的数值变化是
e.a e.b e.lpp.c e.lpp.d
10 10 10 0
30 30 30 0
60 60 60 0
60 60 60 3600

由于e.a、e.b和e.lpp.c是出于同一内存地址,
e={10}; 是给e.a赋值,同时也给e.b和e.lpp.c赋了值
所以

e.b=e.a+20;
e.lpp.c=e.a+e.b;
e.lpp.d=e.a*e.b;

等价于

e.lpp.c = e.lpp.c + 20;
e.lpp.c = e.lpp.c + e.lpp.c;
e.lpp.d = e.lpp.c * e.lpp.c;