前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >printf函数的求值顺序问题

printf函数的求值顺序问题

作者头像
ccf19881030
发布2019-04-29 18:55:19
9540
发布2019-04-29 18:55:19
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

学了这么久的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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年08月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档