小细节--关于printf的输出问题
2019-05-22 06:27:15来源:博客园 阅读 ()
关于printf输出函数,曾经在栈和队列中有过提及,并未作过深入的研究,今天在看一些面经的时候发现有的公司有所提及,那么就势研究一下
面试题如下:
首先看一下printf函数在汇编层面上是如何实现的:
第一行
第一步,i = i + 1,i = 2;
第二步,i = i + 1, i = 3;
第三步,把 i 压入栈中
第四步,把 i 压入栈中,
那么第一行输入就相当于从栈中取出i 输入的就是 3,3
第二行
第一步,把i值存入寄存器【ebp-0D0h】中
第二步,i = i + 1,i = 4
第三步,i = i + 1,i = 5
第四步,把寄存器中的值压入栈中
第五步,把i的值压入栈中
那么同理,出栈的时候,输入的值就为5 ,3
针对这一题来说,需要明确两点
- i++返回的是寄存器里的值,++i返回的是变量里的值
- printf是从右向左进行运算,而printf自身就是一个栈,向屏幕打印的过程就是出栈的过程(同理 c++中cout也是如此)
接下来此类问题都可以按照以上的方法进行考虑,又从网上找到了一些相关问题可以进行练习
1 int i = 1;
2 printf("%d,%d",i--,i++);
由++或者--运算的顺序是从右向左,故先计算i++,i++在计算过程中会产生缓存区,返回的值就是缓存区的值,既是在加1之前需要先备份,这里的缓存区地址就是[ebp-0E8h]=1,之后,i=i+1=2;同理,第二个表达式的缓存区[ebp-0ECh]=2,然后,i=i-1=1;然后把第一,第二个表达式的返回值分别入栈【1,2】故输出为 2 1
此类问题,不仅在面试当中需要注意,并且在日常编程中也尽量避免出现,相同变量在输入中同时出现的情况,作为小细节需要多加注意
2019-05-21 13:09:19 编程小菜鸟自我反省,大佬可以发表一下自己的建议和意见,谢谢!!!
原文链接:https://www.cnblogs.com/xgmzhna/p/10899220.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- 关于使用ffmpeg的一些牢骚 2020-05-08
- 关于有趣的windows.h 2020-03-09
- 学过 C++ 的你,不得不知的这 10 条细节! 2020-02-12
- 关于C/C++的各种优化 2020-02-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash