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

如有错误请指正,谢谢!

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


#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规则,好像函数参数是通过寄存器进行传递,并不是通过栈进行的。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值