您的位置:首页 > 编程语言 > C语言/C++

C语言中printf函数自增自减、入栈和输出关系。

2012-01-10 22:29 309 查看
如有错误请指正,谢谢!

将网上提供的代码做了部分修改进行研究验证,代码如下:

#include<stdio.h>

int main()
{
	int i;
	
	// EX1
	i = 1;
	printf("%d %d %d %d %d %d\n",i,i++,i,--i,++i,i);
	fflush(stdout);
	printf("%d\n",i);
	fflush(stdout);
	
	//EX2
	i = 1;
	printf("%d %d %d %d %d %d %d\n",i,i++,i++,i,--i,++i,i);
	fflush(stdout);
	printf("%d\n",i);
	fflush(stdout);
	
	//EX3
	i = 1;
	printf("%d %d %d %d %d %d\n",i,i--,i,--i,++i,i);
	fflush(stdout);
	printf("%d\n",i);

	return 0;
}


运行结果如下:



根据CSDN论坛UGG网友对printf函数的部分解释如下:

1,print函数在处理变量参数的时候是按照从右至左的次序;

2,a++,在函数运行中,并不进行运算处理,函数运行完毕方才处理;

3,++a,在函数运行行中处理函数,相当于a+=1



在调用printf()时,i++,i--,++i等为表达式,所以需对其进行计算将表达式结果入栈。入栈的过程也可以理解为参数传递的过程,先将函数参数保存在栈中,等待printf库实现来栈中取数据。先入栈的就先保存,此处保存前还需进行计算,但计算结果会对后入栈的有影响,并且自增自减的计算根据结果来看符合网友UGG的说法。也就是说并非所有的自增自减都是进过计算入栈的,i--、i++入栈的直接是i值,并没有进行计算(EX1和EX3可以看出),而是等待调用结束后在进行自增或者自减运算(EX2可以看出)。另外,忽然想到ARM中的参数传递有另外ATPCS规则,好像函数参数是通过寄存器进行传递,并不是通过栈进行的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: