C语言中printf函数自增自减、入栈和输出关系。
2012-01-10 22:29
309 查看
如有错误请指正,谢谢!
将网上提供的代码做了部分修改进行研究验证,代码如下:
运行结果如下:
根据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规则,好像函数参数是通过寄存器进行传递,并不是通过栈进行的。
将网上提供的代码做了部分修改进行研究验证,代码如下:
#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规则,好像函数参数是通过寄存器进行传递,并不是通过栈进行的。
相关文章推荐
- 怎样在TI stellaris lm3sxxx 程序中使用C语言printf()函数进行串口输出
- C语言基本的输入和输出函数(printf()和scanf() )
- C语言中printf格式化输出函数
- c语言printf();函数输出格式
- [黑马程序员]01 [c语言][重要的知识点]printf函数和scanf函数的数据输出与读取问题
- 【C语言天天练(十六)】字符串输出函数puts、fputs和printf
- c语言:请编程序将“China”译成密码,分别用putchar和printf函数输出这5个字符。
- C语言中printf格式化输出函数
- C语言中printf格式化输出函数
- C语言中printf格式化输出函数
- C语言stdio.h中printf函数输出‘12’结果理解
- C语言中printf格式化输出函数
- C语言的printf函数以从右到左的顺序输出,每个数据项可以进行算术但各自互不影响
- C语言--格式化输入/输出函数(printf/scanf,fprintf/fscanf,sprintf,sscanf)
- C语言中printf格式化输出函数(转载)
- C语言格式输出函数printf()详解
- c语言格式化输出函数printf()
- C语言格式输出函数printf()详解
- C语言中如何用printf函数输出百分号?
- C语言输出函数(printf)和输入函数(scanf)