printf函数参数入栈

来源:互联网 发布:服务器有几个端口 编辑:程序博客网 时间:2024/05/17 21:51
char p[10];strcpy(p, "Pek");printf("[%s]\n", p);printf("[%s] [%s]\n", p, strupr(p));其中strupr是转换大小写的函数,这里显示:[Pek][PEK] [PEK]为什么printf("[%s] [%s]\n", p, strupr(p));这里两个都是大写的PEK,即使用printf("[%s] [%s]\n", strupr(p),  p);,回显也是[PEK] [PEK]。

是说printf函数中的参数若有函数,则先执行这个函数,再将返回值作为printf的参数?谢谢!

这个现象确实存在,但并非在printf()函数中要先执行函数的原因。这可以用下面的代码作试验,证明不是这个原因。#include "stdio.h"//。int Add1(int *p){return(*p+=1);}void main(void){int a=1;printf("[%d] [%d]\n",Add1(&a),a);}这段代码的运行结果是[2] [1],说明并没有先执行函数Add1()。而如果把printf("[%d] [%d]\n",Add1(&a),a)改为printf("[%d] [%d]\n",a,Add1(&a))则结果是[2] [2]。这个结果也说明printf()函数确实是从参数列表的右端开始执行的。    那么造成题目中的现象是什么原因呢?这是由C/C++对数组的处理机制造成的。printf()函数在处理数组时只把数组首地址压入栈而并不压入数组下标变量的所有内容(因为没有必要,有首地址就可以输出了)。当printf()函数从参数列表的右端开始一项一项运算压栈到最左端的一个参数后,又从左端的控制符开始按控制符指令一项一项对应弹出。对于其他变量来说,压入的是值,原来计算的结果是什么,弹出的就是什么;而题目中的字符串则不然了,先压入首地址p时,尽管p指向的内容是大小写并存的,但接着被strupr(p)变成全大写了,但压入的首地址还是由strupr(p)返回的同一个地址,弹出来输出时这个地址开始的字串已全是大写字母了……


0 0
原创粉丝点击