printf函数参数入栈

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值