关于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

针对这一题来说,需要明确两点

  1. i++返回的是寄存器里的值,++i返回的是变量里的值
  2. printf是从右向左进行运算,而printf自身就是一个栈,向屏幕打印的过程就是出栈的过程(同理 c++中cout也是如此)

接下来此类问题都可以按照以上的方法进行考虑,又从网上找到了一些相关问题可以进行练习

;

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 编程小菜鸟自我反省,大佬可以发表一下自己的建议和意见,谢谢!!!

 

最新文章

  1. 一些sql二
  2. C#设计模式(20)——策略者模式(Stragety Pattern)
  3. POJ3415 Common Substrings
  4. SQL Server2005中使用XML-数据类型、查询与修改
  5. Hbase案例分析(二)
  6. 201521123051《Java程序设计》第十二周学习总结
  7. Jfinal启动原理及源码简析
  8. vue/axios请求拦截
  9. 后端解决 微信H5支付 商户参数格式错误 方法
  10. Learning-MySQL【6】:视图、触发器、存储过程、函数、流程控制
  11. Nginx挂载维护页或返回自定义响应信息
  12. Spring Cloud 使用 FeignClient 启动报错
  13. QQ登录整合/oauth2.0认证-02-跳转到QQ互联页
  14. vs中如何添加库目录、包含目录以及依赖-----转
  15. 设计模式学习--面向对象的5条设计原则之Liskov替换原则--LSP
  16. Kotlin中的object 与companion object的区别
  17. k-近邻算法 python实现
  18. 扩展gcd codevs 1213 解的个数
  19. OpenCV平滑处理示例代码
  20. 自顶向下理解Java集合框架(三)Map接口

热门文章

  1. 实现本地des和aes 解密的工具
  2. 应急响应系列之OA被入侵挖矿分析报告
  3. 【转】Python编程: 多个PDF文件合并以及网页上自动下载PDF文件
  4. Unity火爆插件Behavior Designer行为树插件学习
  5. 手把手教你如何使用量产工具修复u盘
  6. CMU Database Systems - Sorting,Aggregation,Join
  7. 浏览器cookie数 跨站请求伪造 欧盟Cookie指令
  8. visual studio python快捷键
  9. H2数据库函数及数据类型概述
  10. springMVC Controller 参数映射