前++和后++引发的血案~~!!

作者:宋桓公 
出处:http://www.cnblogs.com/douzi2/ 
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

先看一段奇葩代码:

int main(void)
{
int x = 4;
int y;
y = (x++);
printf("hello world. y = %d.\n", y);
x = 4;
y = (x++)+(x++);
printf("hello world. y = %d.\n", y);
 x = 4;
y = (x++)+(x++)+(x++);
printf("hello world. y = %d.\n", y);
 x = 4;
y = (x++)+(x++)+(x++)+(x++);
printf("hello world. y = %d.\n", y);
x = 4;
y = (++x);
printf("hello world. y = %d.\n", y);
x = 4;
y = (++x)+(++x);
printf("hello world. y = %d.\n", y);
 
 x = 4;
y = (++x)+(++x)+(++x);
printf("hello world. y = %d.\n", y);
 
x = 4;
y = (++x)+(++x)+(++x)+(++x);
printf("hello world. y = %d.\n", y);
return 0;

}

而在VS2012(windows运行环境)的测试结果为:

\\后++y = 4.y = 8.   //4+4y = 12. //4+4+4y = 16. //4+4+4+4\\前++y = 5.   y = 12. //6+6y = 21. //7+7+7y = 32. //8+8+8+8

  

在Ubuntu上测试的结果为:

//后++y = 4.y = 9.   //4+5y =15.  //4+5+6y = 22. //4+5+6+7//前++y = 5.y = 12. //6+6y = 19. //6+6+7y = 27. //6+6+7+8

对应windows上的测试结果都比较好理解:

1、对于后++而言,在赋值之前x不会递增,所以每次多一个x++不过是多一个4的累加而已。

2、对于前++而言,在赋值前x已经递增,所以每次多一个x所对应内存的值都被提高1,最后再相加。

所以出现了出现了6*2  7*3  8*4的结果。

对于linux上的测试结果就不太容易想明白:

1、对于后++而言第二就和windows的结果不一样了,这是因为linux用了产生中间变量的方式。

如:y = (x++)+(x++);被分成了多步:1)tmp = x;  x = x + 1;2) tmp1 = x;  x = x + 1;  3)y  = tmp + tmp1;

1)中tem等于4,并递增了x;2)中tmp1就等4了也递增了x;3)中就等到结果4+5=9

当(x++)递增到三个时也是一样分析,只不过会多一个中间变量tmp2.

2、对于前++,第三个和windows的结果不同了,也是产生了中间变量的缘故:

如:y = (++x)+(++x)+(++x); 被分成了多步:

1)tmp = (++x)+(++x);  2)y = tmp  + (++x);

从而y = 6+6+7

再如:y = (++x)+(++x)+(++x); 被分成了多步:

1)tmp = (++x)+(++x);  2)tmp1 = tmp  + (++x);  3)y =  tmp1 + (++x);

从而y = 6+6+7+8

这里可能唯一让人困惑的是为什么(++x)+(++x)中间没有产生中间变量?而(x++)+(x++)却产生了中间变量?

我猜想是因为前++应为是先递增后赋值,所以直接是x = x+1所以也就没有中间变量的产生,而作为最前面的

两个(++x)与‘+’作用产生一个表达式:(++x)+(++x),这个表达式赋值给一个中间变量在与后面的表达式依次作用。

总结:

1、对于vs的编译器,在一条语句中,没有产生多余的中间变量,而ubuntu中因为产生了中间的变量。

所以后++时ubuntu对x的内存空间有更多的操作,而前++时vs对x的内存空间有更多的操作。导致了结果的不一致。

2、得知了第一点之后,我们应该注意在一条语句中,不要对一个变量进行多次的操作,因为你不知道编译器,对这条语句将产生多少个中间变量,而引发血案~~

转载于:https://www.cnblogs.com/MrListening/p/5504907.html

前++和后++引发的血案相关推荐

  1. 一到关于js函数的前端面试题引发的血案

    题目如下: 1 f = function() { return true; }; 2 g = function() { return false; }; 3 (function() { 4 if (g ...

  2. 一个馒头引发的血案...请看完无极后观看此片,保笑死人不偿命

    一个馒头引发的血案... 采用搞笑的手法拍摄的,笑到你喷饭,极大的讽刺无极 下载地址:点击下载

  3. 波涛汹涌的黄金甲,一碗中药引发的血案!

    严重声明:网路转载 主要情节: 父王(周润发)说母后(巩利)身体虚寒,需要每天定时服用亲自配置的中药,已服用了几十年.而父王早就知道了母后和太子元祥(刘烨)之间的苟且之事,远征回宫后在其中药中加入一味 ...

  4. mysql backlog_一次优化引发的血案

    前些天一个Nginx+PHP项目上线后遭遇了性能问题,于是打算练练手,因为代码并不是我亲自写的,所以决定从系统层面入手看看能否做一些粗线条的优化. 首先,我发现服务的Backlog设置过小,可以通过s ...

  5. 线上 CPU100% 异常案例:一个正则表达式引发的血案

    前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%.通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息. 我们可以看到所 ...

  6. 『转』度百死去飞秋一个BUG引发的血案

    作了一篇文章度百死去飞秋一个BUG引发的血案,昨天,度百死去的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from th ...

  7. 一条SQL引发的“血案”:与SQL优化相关的4个案例

    导读:笔者早年间从事了多年开发工作,后因个人兴趣转做数据库.在长期的工作实践中,看到了数据库工作(特别是SQL优化)面临的种种问题.本文通过几个案例探讨一下SQL优化的相关问题. 作者:马立和 高振娇 ...

  8. 转:一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...

  9. 一个Sqrt函数引发的血案

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  10. 一个“Spring轮子”引发的“血案”(4)

    事件的升级,国产技术社区中所存现出来的浮躁.世态炎凉,在我的一篇<80前>一文,终于引爆了出来. <80前>一文是一个长篇,是我吃这么20多年饭,读了不少书的一些所思.所误.所 ...

最新文章

  1. Calendar.clear(int field)的陷阱
  2. python3练习题:1-10
  3. 手动安装sys驱动文件_海龙工具的正确安装及卸载方法,自己动手丰衣足食
  4. python英语单词 扇贝英语安卓下载_扇贝单词app下载-扇贝单词英语版 安卓版v3.6.503-pc6手机下载...
  5. SQL基础【十九、触发器】(不建议使用触发器的原因)
  6. 站立会议-2014-04-14
  7. 小程序 获取当前用户城市信息(省市区)
  8. linux 脚本调用企业微信_shell或python调用企业微信发送消息(实现报警功能)
  9. 【MongoDB --番外】错误集合
  10. 创建一个SQL测试数据库 - 消费者数据库
  11. jts116_JTS T 116-2019水运建设工程概算预算编制规定.pdf
  12. android studio for android learning (二十四 )bitmap and bitmapFactory
  13. 盘点HTML页面跳转的5种方法
  14. [填坑]QT信号与槽机制注意事项
  15. ide 安装eval reset插件
  16. 定时任务:数据表设计与实现方案
  17. ubuntu14.04自定义系统默认xp字体
  18. Linux du命令(du -h ,du -s)
  19. APS54085 外围电路简单_调光无频闪 智能家居照明
  20. java+如何画一个扇形_实现一个扇形的几种方法

热门文章

  1. 华为5g鸿蒙麒麟,华为5G亮王牌:鸿蒙系统+7800W+麒麟990+防水,钱包按耐不住!
  2. java常见异常_译文最常见的10种Java异常问题
  3. java中到底有没有指针?
  4. MySQL incompatible with sql_mode=only_full_group_by 问题解决
  5. html双击单元格修改,JS实现鼠标双击选中表格单元格代码
  6. mysql8.0 i ha,centos7 mysql8.0 RPM软件包方式安装
  7. php study 后门,phpStudy后门简要分析
  8. 【渝粤教育】广东开放大学 形成性考核 (29)
  9. 【sklearn第十九讲】高斯混合模型
  10. 推荐系统中所需的概率论与数理统计知识