首先看一下代码:

#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--的值如何相关推荐

  1. printf中如何输出长整型?

    资料出处: http://hi.baidu.com/iamstupid/blog/item/26b9c0d0b63e9e8ba0ec9c84.html printf中如何输出 长整型? 一直都听说gc ...

  2. go语言中fmt包中Print、Printf、Println输出相关函数的区别

    go语言中fmt包中Print.Printf.Println输出相关函数的区别 区别: Print系列函数将内容输出到系统的标准输出.其区别:Print函数式直接输出内容,Printf函数支持格式化输 ...

  3. 如何在printf中输出,特殊字符(如:%、\、““)或表示八进制012、十六进制0xc

    如何在printf中输出: 特殊字符(如:%.\."")或表示八进制012.十六进制0xc #include <stdio.h>int main(void) {floa ...

  4. printf中%p的输出应用

    最近在printf遇到一个偏冷的格式控制字符%p,其实它表示的含义可以理解成和%d %x的应用是一样的. 具体来说,%p表示输出以内存中实际存储一个变量格式(十六进制.32位(视机器而定))的值.即如 ...

  5. 华为面试题:请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

    已经很久没有写博客了,2017年的最后一天写一篇,用这样的方式和2017年告别挺好的.这段时间经历找工作,是我这一年截止到目前最迷茫的时期.看看程序,思考能让我冷静下来,不被杂事打扰,前天看到了华为的 ...

  6. java的printf_java中printf中用法详解

    目前printf支持以下格式: %c 单个字符 %d 十进制整数 %f 十进制浮点数 %o 八进制数 %s 字符串 %u 无符号十进制数 %x 十六进制数 %% 输出百分号% printf的格式控制的 ...

  7. #37 删除字符串中连续的重复字符

    题目描述: 实现删除字符串中连续的重复字符(除字母和数字).输入为字符串,将字符串中连续重复的,不是字母且不是数字的字符删去,然后输出处理后的字符串. 输入字符串最长50个字符,之后截断,只输出处理后 ...

  8. 将字符串中连续的相同字符仅保留1个

    编写函数,将字符串中连续的相同字符(包括空格)仅保留1个 输入样例: a bb cccd d ef 输出样例: a b cd d ef 代码如下: #include <stdio.h> # ...

  9. 求一个字符串中连续出现的次数最多的子串

    求一个字符串中连续出现的次数最多的子串.例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复 ...

  10. C语言中连续调用rand函数,返回值不变

    C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...

最新文章

  1. busybox filesystem httpd php-5.5.31 sqlite3 webserver
  2. linux如何查看系统架构?(查看系统架构命令)(armv7l)
  3. Linux操作系统中内存buffer和cache的区别--从free命令说起(转)
  4. PHP多条件模糊查询
  5. 针对不同创业阶段的创业者适合参加哪些创业赛事活动呢?创业是一场异常艰辛的马拉松,坚持是唯一的捷径,借...
  6. Node.js 从门详解 (二)
  7. C++中dynamic_cast的简介
  8. 2020webpack的面试题(webpack)
  9. IPWorks V6 Sax CommStudio Fall 2005 破解
  10. android反调试之父子调试
  11. 100亿+数据量,每天50W+查询,携程酒店数据智能平台实践
  12. 通过代理下载Google Code
  13. 小设备 大智慧——天霆交互技术让终端变得更智能
  14. 个人微信小程序开发入门教程:注册个人小程序
  15. 百度网页不能连接服务器错误,win10系统登陆百度浏览器提示连接服务器错误的恢复步骤...
  16. K40自动重启的分析(RTC)
  17. [整理] 如何学习插画,美术等
  18. 关于js中的类式继承
  19. 无法打开虚拟磁盘服务器,win2008R2 修改了带有快照的父虚拟磁盘;导致启动不了...
  20. android 适配红米,小米MIUI放出Android Q适配计划,11款手机参与,包括红米Note 7

热门文章

  1. 45个小众而实用的NLP开源字典和工具
  2. 安装Sublime Text 3插件的方法:
  3. GCC中的编译选项“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
  4. 高项_第九章人力资源管理
  5. mysql key reads 参数_mysql Key_reads 调优(转)
  6. Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN
  7. SQL语句进阶学习一(where、通配符、正则表达式、计算字段、数据处理函数、分组数据)
  8. idea 提示Expecting newline or semicolon解决办法
  9. 解决git fatal:无法找到‘https‘的远程助手
  10. DNS域名解析全过程