入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

C++里面的print()函数的问题

创建时间:2016-09-11 投稿人: 浏览次数:107
今天碰到这么一个问题,程序是这样的:
#include <stdio.h> 
int f(int a, int b, int c)
{
	return 0;
}
int main()
{
	return f(printf("a"), printf("b"), printf("c"));
}

很简单的程序对吧,我开始以为输出“abc”,结果输出为“cba”。(不会有人认为编译不过吧?)

我查了很多资料,先不看我这个程序,我们先看看下面那个哥们的程序,文章在http://blog.sina.com.cn/s/blog_8d3652760100x1x1.html

里面说到了printf打印多个参数的处理情况,其实print把参数一个个压到栈里,然后把参数一个个从栈头取出来处理,处理完了之后再从栈底进行打印,整个过程就是这样的。

比如他里面的这句话:

printf("%d, %d, %d, %d, %d, %d ",++i,++i,++i,++i,++i,++i);

暂定第一到第六分叫i(1)~i(6)吧,开始i的初始值为8;

程序先腾出一个空间来,把i(1),i(2),i(3),i(4),i(5),i(6)分别压入,然后开始处理了i(6)的那个空间值为i++即为9,i(5)的那个空间值为i++即为10,

i(4)的那个空间值为i++即为11,……,一直到i(1)的那个空间值为i++即为14。好的,现在已经把栈里的数据处理完了,开始打印了,打印则又从左边i(1)的地方开始,打印出来为14131211109。

好了,现在回到我最上面的那段程序,有人会奇怪,对啊,我这个程序printf里面只有一个字符变量啊,那肯定是顺序执行就好了。但是不是的!!!

f(int a, int b, int c)函数也是按照压栈的形式处理的!!!这种处理方式在程序里比比皆是。
f()函数也是先将变量a,b,c 压入,然后运行c这块是什么啊,哦,c这块是print(“c”)好吧,那我就首先运行print(“c”)之后把它放在c这个变量的空间吧(这时已经打印了c到屏幕上了),接着是b,a。最后好了,我们运行再运行f()函数体,但是函数体里面什么都没有,好吧,那就这样返回吧。程序结束。</span>
所以结果是“cba”。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。