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
- printf函数参数入栈
- printf 参数入栈顺序
- 函数参数入栈
- 函数参数入栈
- 关于数组指针取值操作以及printf( )函数参数入栈的顺序
- 函数参数入栈问题
- printf函数的参数压栈问题
- printf函数参数压栈顺序
- printf函数可变参数
- printf函数参数问题
- 函数参数的入栈顺序
- C++函数参数的入栈顺序
- c语言函数参数入栈顺序
- C语言中变长参数表printf的实现和参数入栈次序之间的关系
- 由这段代码发现的printf参数的入栈顺序
- printf()函数参数格式详解
- printf()函数参数格式详解
- 可变参数:printf函数实现
- Linux设置和查看环境变量的方法
- 构造了一种难解的非线性一阶常微分方程,边值特殊;但可用非常规方法求解
- 华为编程规范
- GET和POST区别
- 关于项目管理,关于团队建设
- printf函数参数入栈
- Pig 中的一些语法知识。
- Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
- 5分钟搞定内存字节对齐
- 一个自由开发者首选的java快速开发平台
- ubuntu搭建SVN实现https协议传输
- Android canvas.drawBitmap(...)Bitmmap图片在模拟器和真机上位置不一致问题
- jquery uploadify 上传成功404 和 GET请求 404 Not Found
- Android中Json数据解析(二)--使用Gson、Jackson和FastJson解析Json数据