printf中连续输出i++,--i,++i,i--的值如何
首先看一下代码:
#include <stdio.h>
void main()
{
int i=10;
printf("%d %d %d %d %d\n",i--,--i,++i,i++,i);
}
开始我的预测答案是:11 11 12 10 10
运行后:11 10 10 10 10
开始我认为是printf的问题就用函数进行了输出,代码如下:
#include <stdio.h>
void fun(int a,int b,int c,int d,int f)
{
printf("%d %d %d %d %d\n",a,b,c,d,f);
}
void main()
{
int i=10;
fun(i--,--i,++i,i++,i);
}
然而结果还是11 10 10 10 10
所以就对前一段代码进行了反汇编,看一下汇编是如何处理这个的:
运算过程:
00B13C25 mov eax,dword ptr [i] 从i中取出值放入eax寄存器中
00B13C28 mov dword ptr [ebp-0D0h],eax 将寄存器的值保存在临时量中
00B13C2E mov ecx,dword ptr [i] 取出i的值,加一后写回i
00B13C31 add ecx,1
00B13C34 mov dword ptr [i],ecx
00B13C37 mov edx,dword ptr [i] 取出i的值,加一后写回i
00B13C3A add edx,1
00B13C3D mov dword ptr [i],edx
00B13C40 mov eax,dword ptr [i] 取出i的值,加一后写回i
00B13C43 sub eax,1
00B13C46 mov dword ptr [i],eax
00B13C49 mov ecx,dword ptr [i] 取出i的值,保存在临时量中
00B13C4C mov dword ptr [ebp-0D4h],ecx
00B13C52 mov edx,dword ptr [i] 取出i的值,加一后写回i
00B13C55 sub edx,1
00B13C58 mov dword ptr [i],edx
输出过程:
00B13C5D mov eax,dword ptr [i] 从I中取出值放入寄存器中后入栈
00B13C60 push eax
00B13C61 mov ecx,dword ptr [ebp-0D0h] 从保存后置++的ebp-0D0h中取出值放入寄存器后入栈
00B13C67 push ecx
00B13C68 mov edx,dword ptr [i] ++i
00B13C6B push edx
00B13C6C mov eax,dword ptr [i] --i
00B13C6F push eax
00B13C70 mov ecx,dword ptr [ebp-0D4h] i--
00B13C76 push ecx
从上面的汇编可以看出:编译器在处理前置,和后置时是不一样的。
在处理后置时:是将值放入临时量中,在输出时直接从临时量中取值
在处理前置时:是等运算完成后,直接从I的地址中取值
所以才会出现上面那种与我们以前的想法不同的值。
printf中连续输出i++,--i,++i,i--的值如何相关推荐
- printf中如何输出长整型?
资料出处: http://hi.baidu.com/iamstupid/blog/item/26b9c0d0b63e9e8ba0ec9c84.html printf中如何输出 长整型? 一直都听说gc ...
- go语言中fmt包中Print、Printf、Println输出相关函数的区别
go语言中fmt包中Print.Printf.Println输出相关函数的区别 区别: Print系列函数将内容输出到系统的标准输出.其区别:Print函数式直接输出内容,Printf函数支持格式化输 ...
- 如何在printf中输出,特殊字符(如:%、\、““)或表示八进制012、十六进制0xc
如何在printf中输出: 特殊字符(如:%.\."")或表示八进制012.十六进制0xc #include <stdio.h>int main(void) {floa ...
- printf中%p的输出应用
最近在printf遇到一个偏冷的格式控制字符%p,其实它表示的含义可以理解成和%d %x的应用是一样的. 具体来说,%p表示输出以内存中实际存储一个变量格式(十六进制.32位(视机器而定))的值.即如 ...
- 华为面试题:请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
已经很久没有写博客了,2017年的最后一天写一篇,用这样的方式和2017年告别挺好的.这段时间经历找工作,是我这一年截止到目前最迷茫的时期.看看程序,思考能让我冷静下来,不被杂事打扰,前天看到了华为的 ...
- java的printf_java中printf中用法详解
目前printf支持以下格式: %c 单个字符 %d 十进制整数 %f 十进制浮点数 %o 八进制数 %s 字符串 %u 无符号十进制数 %x 十六进制数 %% 输出百分号% printf的格式控制的 ...
- #37 删除字符串中连续的重复字符
题目描述: 实现删除字符串中连续的重复字符(除字母和数字).输入为字符串,将字符串中连续重复的,不是字母且不是数字的字符删去,然后输出处理后的字符串. 输入字符串最长50个字符,之后截断,只输出处理后 ...
- 将字符串中连续的相同字符仅保留1个
编写函数,将字符串中连续的相同字符(包括空格)仅保留1个 输入样例: a bb cccd d ef 输出样例: a b cd d ef 代码如下: #include <stdio.h> # ...
- 求一个字符串中连续出现的次数最多的子串
求一个字符串中连续出现的次数最多的子串.例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复 ...
- C语言中连续调用rand函数,返回值不变
C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...
最新文章
- busybox filesystem httpd php-5.5.31 sqlite3 webserver
- linux如何查看系统架构?(查看系统架构命令)(armv7l)
- Linux操作系统中内存buffer和cache的区别--从free命令说起(转)
- PHP多条件模糊查询
- 针对不同创业阶段的创业者适合参加哪些创业赛事活动呢?创业是一场异常艰辛的马拉松,坚持是唯一的捷径,借...
- Node.js 从门详解 (二)
- C++中dynamic_cast的简介
- 2020webpack的面试题(webpack)
- IPWorks V6 Sax CommStudio Fall 2005 破解
- android反调试之父子调试
- 100亿+数据量,每天50W+查询,携程酒店数据智能平台实践
- 通过代理下载Google Code
- 小设备 大智慧——天霆交互技术让终端变得更智能
- 个人微信小程序开发入门教程:注册个人小程序
- 百度网页不能连接服务器错误,win10系统登陆百度浏览器提示连接服务器错误的恢复步骤...
- K40自动重启的分析(RTC)
- [整理] 如何学习插画,美术等
- 关于js中的类式继承
- 无法打开虚拟磁盘服务器,win2008R2 修改了带有快照的父虚拟磁盘;导致启动不了...
- android 适配红米,小米MIUI放出Android Q适配计划,11款手机参与,包括红米Note 7
热门文章
- 45个小众而实用的NLP开源字典和工具
- 安装Sublime Text 3插件的方法:
- GCC中的编译选项“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
- 高项_第九章人力资源管理
- mysql key reads 参数_mysql Key_reads 调优(转)
- Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN
- SQL语句进阶学习一(where、通配符、正则表达式、计算字段、数据处理函数、分组数据)
- idea 提示Expecting newline or semicolon解决办法
- 解决git fatal:无法找到‘https‘的远程助手
- DNS域名解析全过程