69,371
社区成员
发帖
与我相关
我的任务
分享
int a = 5;
a = (a++) + (a++) + (a++);
printf("%d",a);
这个结果是18,为什么?同上5+5+5 = 15;之后遇到”;“遇到顺序点时所有的赋值都会反馈回去,所以这里15要加3次,结果是18.
再看你的p = 24还是22,这个结果还真是不确定的,C里面没有给出其计算顺序,看做编译器的人了。
22 = 7 + 7 + 8;
24 = 8 + 8 + 8;
不要问我为什么这么算,问问做编译器的人吧。我个人觉得不要纠缠这东西,没有任何意义,只有大学老师才拿些这玩意来显示他很有水平,其实他自己都不一定真的懂!
最后一个,为什么顺序是反的,其实从你自己的结果来看就很明白了,其实不光是你这里的printf函数是反的,其他函数也是的,瞧瞧下面这个!
#include <stdio.h>
void print(int i,int j)
{
printf("%d\n",i);
printf("%d\n",j);
}
int main()
{
int a = 5;
print(a++,a++);
return 0;
}
这里也是和顺序点相关的,但是这里需要注意一下,楼上很多都说printf结果和编译器有关,确实有关系(函数参数的求职顺序依赖于编译器的实现),但是你的那个结果和我的这个例子它是由顺序点决定的,不管编译器是哪种,结果都一样,希望别搞混了。
写了这么多了,我就再多费几句话说说什么是顺序点吧!
顺序点是指在执行过程中修改变量值的最晚时刻,在程序到达顺序点的时候,之前所做的一切操作必须反映到后续的访问中。顺序点存在于:
每个完整表达式结束时;
&& || ?: 以及逗号表达式的每个云端对象之后
函数调用中对所有实际参数的求值完成之后(进入函数体之前)。