故事发生在2019.7.15的3.pm,正在复习数据结构题目,写了一句如下指令(以下函数运行在win10的dev编译器下面)

#include<bits/stdc++.h>
using namespace std; int main(void){
int a = 0;
printf("%d\n", a++);
// printf("%d%d\n", a++, ++a);
return 0;
}

  

  发现2条语句输出不一样,你敢信?前面输出0,后面输出1,2,心态瞬间就崩了,同为a++,2次结果输出不一样!!!随后找了晗神和谢大佬,2位大佬给出的答案不一样

晗神(centos的g++运行环境):前面是0,后面是0,1 ( 和我一样,当场崩溃,怀疑是编译器原因)

谢大佬:不同编译器结果不同!!!(顿悟为什么晗神和自己输出结果不一样)

--------------------------------------------------------------- ------------------------------------------------------------------

----------------------------------------个人建议:后面内容没必深入了解,只要注意别将a++,a--,--a,++a一起输出就好 ------------------------

-------------------------------------------------------------------------------------------------

但是为什么我会输出1,2呢?

  汇编语言解释一下(以i++,--i为例)

  

这三句汇编中执行了–操作,说明,printf函数中,两个i,先计算–i,然后计算i++,然后计算--i.
这三句话做了一下的事情:
1.将i从内存中取出来,然后存入到寄存器中。
2.将寄存器中的值-1。
3.将寄存器中减过1得值存入到内存地址中去。
总结:前置减减,是对值做了减操作后,将其存入到原来的位置。
    简单来说:就是先-i,然后计算i++,再算--i, 也就是说(i = 0,结果会输出-1, 0)

  全部列出来:

    

#include<bits/stdc++.h>
using namespace std; int main(void){
int a = 0;
// printf("%d\n", a++); //输出0
// printf("%d%d\n", a++, ++a); //输出1 2
// printf("%d%d\n", a++, a++); //输出1 0 ---
// printf("%d%d\n", a++, --a); //输出-1 0
// printf("%d%d\n", a++, a--); //输出-1 0
// printf("%d%d\n", ++a, ++a); //输出2 2
// printf("%d%d\n", ++a, a++); //输出2 0 ---
// printf("%d%d\n", ++a, --a); //输出0 0
// printf("%d%d\n", ++a, a--); //输出0 0 return 0;
}

    但是a++, a++ 与 ++a,a++输出结果不符合道理,然后看下面这篇博客

    https://blog.csdn.net/findgeneralgirl/article/details/78376834

    总结了一句话:猜测:a++放的是临时变量,++a是直接计算,

              假设a = 0

              也就是说a++,a++这样,先将a++压栈,临时变量a + 1,然后输出a++(输出1),但是临时变量不影响后面a++的值,所以 a++依然是0

              而对于a++,++a这样,先压栈,临时变量a + 1,然后输出a++(输出1),临时变量影响++a的值,所以++a是2

           后面运算--a,a++,--a,a--之类的也满足上面的观点

    由于不同编译器运行结果不一样,所以没事最好别把a++,++a写到一条语句里面

拓展(湖南大学2012年研究生入学真题):

    1.a = 2,b = 3, b+=(++a)+(++a)

     分析:b += 优先级最低,最后面算,先拆2个括号a = 4,b += (4 + 4) ,b = 11

    2.i = 5, i+++i 

     分析: ++优先级比+高,所以i = 6即(i++) + i = 5 + 6 = 11,若改成(++i) + i = 6 + 6 = 12

  

    

a++与++a的陷阱与盲区的更多相关文章

  1. 你可能不知道的陷阱, IEnumerable接口

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

  2. java笔记--笔试中极容易出错的表达式的陷阱

    我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用 ...

  3. 【Swift】iOS UICollectionView 计算 Cell 大小的陷阱

    前言 API 不熟悉导致的问题,想当然的去理解果然会出问题,这里记录一下 UICollectionView 使用问题. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cn ...

  4. JavaScript中的this陷阱的最全收集

    JavaScript来自一门健全的语言,所以你可能觉得JavaScript中的this和其他面向对象的语言如java的this一样,是指存储在实例属性中的值.事实并非如此,在JavaScript中,最 ...

  5. 高性能MySQL(四):schema陷阱

    一.schema陷阱 二.缓存表和汇总表 三.范式和反范式

  6. C#_闭包陷阱

    如果匿名方法(Lambda表达式)引用了某个局部变量,编译器就会自动将该引用提升到该闭包对象中. 即将for循环中的变量i修改成了引用闭包对象的公共变量i.这样一来,即使代码执行后离开了原局部变量i的 ...

  7. 安装 Linux 时碰到的硬盘分区的陷阱及应对

    硬盘分区的陷阱及应对 之所以想到写这篇,是因为本人在折腾 Linux 系统的过程中,有多次掉入硬盘分区的陷阱的经历.最近几天,再一次掉入坑中,折腾了两天才从坑中爬出来.经过多方查询资料,终于弄明白了硬 ...

  8. NULL的陷阱:Merge

    NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是fals ...

  9. 洛谷P1156 垃圾陷阱[背包DP]

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...

随机推荐

  1. linux重定向与管道符(一)

    linux重定向和管道符 为什么要使用重定向 1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候: 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时: 3.系统的例行命令,例如定时任务的执 ...

  2. CHI 2013:人机交互领域那些令人兴奋的新技术

    2013:人机交互领域那些令人兴奋的新技术" title="CHI 2013:人机交互领域那些令人兴奋的新技术"> 编者按:CHI是人机交互领域首屈一指的国际盛会, ...

  3. VSTO开发中级教程 配套资源下载

    项目实例源代码: 编程过程中用到的工具.软件: 教学视频:

  4. 常用面试sql(1)

    1:update qr_user_info set score =score+50 where level=3 2:delete from qr_user_info where level is nu ...

  5. es6变量和函数的提升、暂时性死区?

    es6变量和函数的提升.暂时性死区?

  6. deeplearning.ai 人工智能行业大师访谈

    Geoffrey Hinton 1. 怀揣着对大脑如何存储记忆的好奇,Hinton本科最开始学习生物学和物理学,然后放弃,转而学习哲学:然后觉得哲学也不靠谱,转而学习心理学:然后觉得心理学在解释大脑运 ...

  7. iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码

    iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...

  8. python中的reduce函数

    python中的reduce   python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是 ...

  9. linux上python3的安装

    我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自 ...

  10. MyBatis if test 传入一个数字进行比较报错 There is no getter for property named 'userState' in 'class java.lang.Integer'

    在写MyBatis映射文件中,我要传入一个 int 类型的参数,在映射文件中用 'test' 中进行比较,我花了很长时间百度,发现都是不靠谱的方法,有把数字在比较时转成字符串用 equals 比较的. ...