C语言运算符相关

来源:百度知道 编辑:UC知道 时间:2024/05/22 06:40:20
#include "stdafx.h"

void main()
{
int a1,a2,a3,a4,b1,b2,b3,b4;
a1=a2=a3=a4=10;
b1=(a1++)+(a1++)+(a1++);
b2=(++a2)+(++a2)+(++a2);
b3=(a3--)+(a3--)+(a3--);
b4=(--a4)+(--a4)+(--a4);

printf("a1=%d,a2=%d,b1=%d,b2=%d\n",a1,a2,b1,b2);
printf("a3=%d,a4=%d,b3=%d,b4=%d\n",a3,a4,b3,b4);
}
麻烦看一下上面的程序。
答案说b2和b4的输出结果为39和21
但是我运行时却为37和23
麻烦帮解释一下,谢谢!

经过调试发现编译器内部是这样做的:
当遇到同一个变量有多个++操作的时候,将头两个结合进行结果返回。
比如:b2=(++a2)+(++a2)+(++a2);
因为编译器把前面两个(++a2)+(++a2)结合在一起进行计算,a2等于10,经过2次++,得a2等于12,因此返回12,得到12+12=24,然后再和第三个++a2进行相加,此时a2再加1等于13,从而24+13=37
如果再多一个的话:b2=(++a2)+(++a2)+(++a2)+(++a2);
你可以试一下,跟刚才分析的一样,也是头两个结合,头两个相加结果24,然后和第三个进行相加,此时a2加1等于13,24+13=37,最后和第四个进行相加,此时a2加1等于14,37+14=51。
如果再多加几个也是一样,后面的都不会结合相加结果返回的,只有头两个是这样。因此我认为这跟编译器强相关,不同的编译器可能输出结果不同。

还有b4,跟前面的相同,也是把头两个(--a4)结合起来返回了,所以返回的是8+8=16,再和第三个相加,此时a4减1等于7,16+7=23

至于答案,我觉得39(13+13+13得到)和21(7+7+7得到)更为合理。或者是36(11+12+13得到)和24(9+8+7得到)也较为合理。
VC的输出37和23,则较为不合理,做法有点令人匪夷所思。我个人认为是bug

这个具体答案是和编译器有关的,有的出来时39,有的是37,具体39是这样算的,先是3个a2++,得到a2=13,再将3个相加就是39,37是这样算的,先是a2++2次,得到a2=12,相加得24,再将a2++,a2=13,24+13=37..
不同编译器有不同写法。。基本没任何意义,实际中不该有这样的写法,出题倒是有,另推荐本书 C语言深度解剖,里面有更详细说明。