相信很多coder在学习C语言(包括C++)的过程中都听说过这样的建议:慎用自增自减运算符。

这是因为,在函数参数或者表达式中多次调用自增自减运算符很可能产生“不可预知的结果”。究竟有多不可预知呢?请看这样一个程序

#include

int main()

{

int c, res;

c = 5;

res = (++c) + (++c);

printf("%d %d", c, res);

return 0;

}

首先定义变量c和res,给c赋值5,然后将(++c)+(++c)的值赋值给res,最后输出c和res。按照正常的思路:第一个(++c)先将c自增为6然后返回这个值6,第二个(++c)再将c自增为7并返回7,最后将6和7相加得到13赋给res。这样的话输出应该是这样的:

7 13

程序看似简单,但运行结果却很神奇:

7 14

c的输出和我们预想的一样,经过两次自增运算,5变成了7。但是,res的值就令人费解了,为什么会输出14呢?经过Simollus对程序反汇编的研究之后,发现了这样的问题。

这是反汇编的一个片段,注释是为方便理解改写成C语言样式:

6: c = 5;

00401028 mov dword ptr [ebp-4],5 //c = 5;

7: res = (++c) + (++c);

0040102F mov eax,dword ptr [ebp-4] //eax = c;

00401032 add eax,1 //eax +=1;

00401035 mov dword ptr [ebp-4],eax //c = eax;

00401038 mov ecx,dword ptr [ebp-4] //ecx = c;

0040103B add ecx,1 //ecx += 1;

0040103E mov dword ptr [ebp-4],ecx //c = ecx;

00401041 mov edx,dword ptr [ebp-4] //edx = c;

00401044 add edx,dword ptr [ebp-4] //edx += c;

00401047 mov dword ptr [ebp-8],edx //res = edx

可以发现,C语言的编译器犯了一个小小的“错误”,没有意识到c的值已经改变,在做最后的加法运算时调用了两次同样的c,导致结果成为7+7=14。当然,不同的编译器可能会犯不同的错误,也有可能不犯错误。

在这篇文章中有对于这种现象更为详细的例子分析。尽管我们可以了解并预知程序在不同编译器下会产生不同的结果,但是我认为最好的解决办法是:

不要连续使用自增自减运算符

注:本文所有程序均为在Visual C++ 6.0下编译运行,由于平台不同可能产生不同运行结果。

C语言连续自动自加怎么表示,为什么不建议在C语言中连续使用自增自减运算符...相关推荐

  1. C语言系列之自增自减运算符的用法(二)

    运算符中最难理解的有自增自减运算符的使用方法,下面我将简单总结一下他们的使用方法 我们知道,C语言运行是由右向左运行的 下面我们来看一个例子 当i等于3的时候 j=++i; 由上面可知,C语言是由右向 ...

  2. c语言自增自减5运算符详解,巧用C语言中的自增自减运算符

    黄建琼 摘要:自增自减运算符在C语言的编程过程中经常用到,具有重要的作用,而灵活使用自增自减运算符则是个难点.该文从几个例子入手,观察运行的结果,对结果进行分析,最后得出结论.以期能使初学者避重就轻, ...

  3. c语言ll和 amp amp 优先级,关于C语言自增自减运算符的灵活使用.pdf

    DOI:10.3969/j.issn.1001-8972.2012.24.035 {int m=2,n: n=fun(m,++m): l?rintf("%d",n):} int f ...

  4. c语言3u减1,C语言的自增自减运算符及应用

    在C语言中,经常使用自增自减运算符.本文结合实例,对C语言中自增自减运算符的应用技巧进行了分析. 维普资讯 http://doc.xuehai.net J u a fAn a gT a h r olg ...

  5. c语言中自增自减运算符,C语言中自增自减运算符的深入剖析

    C语言中自增自减运算符的深入剖析 李文广 李俊荣 赵妍 . (1.沧州职业技术学院,2沧州工贸学校) [摘要]本文从多方面对自增自减运算符分析.讲解,以便让初学者 能够清晰自增自减运算符的运算规律,学 ...

  6. C语言经典实例:1-10例:三角求和、显示所占字节数、自增自减运算while语句输出最小值、计算快递费用、学生成绩统计

    文章目录 C语言经典实例:1-10例:三角求和.显示所占字节数.自增自减运算while语句输出最小值.计算快递费用.学生成绩统计等 1.程序的编写工具 2.项目的创建 3.C语言经典实例1-10编写的 ...

  7. c语言:自增自减运算符的操作详解

    博主在回忆c语言的基本知识时,突然发现自增自减运算符(--.++)这个知识点有些模糊不清,故博主为了给同为小白的同学们提供一些经验,特写下这篇文章. 首先,自增自减运算符共有两种操作方式. 比如,我先 ...

  8. python语言编写从一加到100_python学习: 如何循序渐进学习Python语言

    大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...

  9. C语言——赋值运算符、复合的赋值运算符、自增自减运算符、逗号运算符、条件运算符、goto语句、注释

    目录 一.赋值运算符 二.复合的赋值运算符 三.自增自减运算符 四.逗号运算符 逗号表达式的语法 五.条件运算符 六.goto语句 七.注释 一.赋值运算符 语法: - int a; - a = 5; ...

最新文章

  1. 程序员成长路上的团队修炼之道
  2. 消息称微软计划收购GitHub,估值超50亿美元
  3. 基于Yolov5的烟火检测——模型训练与C++实现部署
  4. KUKA profesafe
  5. php设置超链接,怎么给一个PHP密码访问页面加超链接
  6. 信息学奥赛一本通 1311:【例2.5】求逆序对 | 1237:求排列的逆序数 | OpenJudge NOI 2.4 7622:求排列的逆序数 | 洛谷 P1908 逆序对
  7. 给开源项目贡献代码_您可以为开源做出6种非代码贡献
  8. codeforce 780C Andryusha and Colored Balloons
  9. 【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
  10. MSP430单片机与SIM800A调试
  11. Gym 100818 F Irrational Roots (数学)
  12. 台式计算机网卡驱动不能正常使用,系统提示“您的网卡驱动程序不正常!”怎么办 是什么原因...
  13. win10和win11系统qq远程不能控制(点不动)的终极解决方法
  14. 各种纯净版window系统下载分享
  15. spring工作机制及原理
  16. 应用在智能触摸遥控器中的触摸芯片
  17. 云服务器的主要性能参数,云服务器参数到配置,一文让您从小白到高手
  18. [4G5G专题-30]:物理层-基带无线资源、物理层帧结构、无线资源调度
  19. java编程思想初始化引用,JAVA编程思想--第5章 初始化与清理
  20. USACO2012 Moo /// 模拟 oj21548

热门文章

  1. android 6.0 拨号界面,【Dialer】android6.0拨号界面分析一
  2. Go Mod引用私有库
  3. 泊松分布、高斯分布、卡方检验与noise level
  4. 小白避坑系列--Ubuntu1804 RTX3060显卡实现双屏
  5. 上班防摸鱼插件(知乎页面)
  6. MSE-初始化MSE
  7. Cisco ASA防火墙实现IPSec 虚拟专用网,可跟做!!!
  8. android crash存储位置,在Android手机上保存Crash Log
  9. 【linux系统】ubuntu18.04蓝牙耳机没有声音
  10. iOS大型项目开发架构