printf函数的求值顺序问题
来源:互联网 发布:周扬青 淘宝直播 编辑:程序博客网 时间:2024/04/30 23:36
学了这么久的C语言,没想到对C语言中常见的printf函数还不是很了解。
有以下程序段:
设int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
答案为什么是:8,8
这是一道华为面试题。
这个题考的关键就是printf的运算顺序。
printf的参数,函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有从右边开始处理的。
这个是比较绕的一个问题,主要考验的是i++ 和++i :
我们逐个分析:
int arr[]={6,7,8,9,10};
int *ptr=arr;
//这里ptr是数组的首地址。
*(ptr++)+=123;
//这个我们将之拆分
//1. 首先是 ptr++, 这个时候重点看到是后++,也就是说返回的ptr还是原来的ptr的值,也就是arr的首地址。
//那么这句话也就转换成了 a[0]+=123,即运算后 a[0] = 129
//2. 这整句运行完之后,ptr才真正的++。也就是说,这个时候ptr指向的数组第二个位置,也就是7
printf("%d,%d",*ptr,*(++ptr));
//这一句有一个函数参数入栈的顺序,一般VC的编译器是从右往左入栈,那么这个运算也自然是从右往左。
//++ptr之后ptr再次向后一个位置移动,即a[2],8。
//前面的*ptr自然也就是8,所以这句运行之后输出的是8,8
- printf函数的求值顺序问题
- “未定义”的求值顺序问题
- printf 函数的运算顺序
- 函数printf的运算顺序
- 由求值顺序所带来的问题
- 关于C/C++的求值顺序问题
- 求值顺序问题
- 求值顺序问题
- printf函数调用时进栈的顺序
- printf()函数的参数执行顺序
- printf的工作顺序和++问题
- printf打印参数的顺序问题
- php printf函数顺序
- printf函数栈的问题
- printf问题--参数顺序
- printf函数与cout参数压栈顺序问题
- 表达式的求值顺序
- 关于C/C++中表达式求值顺序的深层次问题
- shell脚本重要的常识
- poj 1147 Binary codes
- Quartz动态管理任务
- FastReport4.0安装
- poj 1207 The 3n + 1 problem
- printf函数的求值顺序问题
- poj 1200 Crazy Search
- VC中利用多线程技术实现线程之间的通信(转)
- 关于RMAN recover 过程的讨论
- poj 1201 Intervals
- 蛋白质磷酸化修饰相关计算资源汇总
- linux下gcc编译c程序
- Meego一把
- 在同一网段和不同网段通信的区别