令人纠结无比的a[i++]=i++

	int j = 0;
	int a[10];
	a[++j]=j++;

	int j = 0;
	int a[10];
	a[++j]=++j;

	int j = 0;
	int a[10];
	a[j++]=j++;

	int j = 0;
	int a[10];
	a[j++]=++j;

今天朋友问我,上面四个式子执行后,数组a的值分别是什么

正确答案是a[1] = 0, a[2] = 2, a[0]=0, a[1] = 1。和大部分人一样,我第一次也答错了。这四个式子看起来让人头晕,结果好像也十分奇怪。

因此我对这些代码用反汇编窗口进行调试

可以发现,含有j++的表达式,其中最后的j=j+1的递增操作总是在最后执行,看到这里想必大家都发现貌似j++的两个基本操作被打散了,它们不再是紧挨着执行了(不是返回j之后立马自增)。同时可以看到此时赋值操作总是在++j操作完成后进行。换句话说,当一行表达式中的++j全部计算完毕之后,再把表达式中的所有j全部替换成更新之后的值。若表达式还有j++,则最后执行j++的操作。

举个例子

	int j = 0;
	int a[10];
	a[j++]=++j;

有一个++j,则表达式

a[j++]=++j等价于a[j]=j,(j=1),j++,故结果为a[1]=1,j=2

        int j = 0;
	int a[10];
	a[j++]=j++;

没有++j表达式

a[j++]=j++等价于a[j]=j,(j=0),j++,故结果为a[0]=0,j=1

时间: 2024-11-25 20:46:33

令人纠结无比的a[i++]=i++的相关文章

令人纠结的两行代码

我的主力博客:半亩方塘 以下内容系原创,转载请务必注明地址 主要参考资料:我在 Stackoverflow 上提的问题 Why the first is right but the second is wrong ? 这令人纠结的两行代码如下: const char *cval = "nothing"; // 正确 int *ival = {1, 2, 3, 4}; // 错误 为什么第一行代码正确第二行代码错误呢?既然 "nothing" 在内存中是以数组的形式存

周鸿祎:令人激动无比的第四次工业革命即将到来

这是一篇周鸿祎的很有见地的思想的文章,这也是当前YS业务面对的问题与挑战!值得推荐. 第七届中美互联网论坛在12月2日-3日在美国华盛顿召开,本次论坛的主题是“对话与合作”,我代表中国互联网企业在论坛上发表主题演讲.我觉得中国的互联网并不是美国互联网的镜像或是复制品,中国已经成为全球最大的互联网大国之一,过去都是美国互联网模式到中国来,但未来,会有更多中国创造的模式到美国来.同时,随着IOT设备的急速增长,互联网将进入真正的大数据时代,这也将带来前所未有的全球性安全威胁.   以下是演讲全文:

万恶的KPI、新兴的OKR及让人纠结的程序员考核

最近两天在研究研发部门如何进行绩效管理(其实一直都在思考,关注,实践,总感觉无从下手,也想求助咨询公司,无奈囊中羞涩).查了两天的资料,主要的方向是KPI,OKR,谷歌等互联网公司的考核方法.这里做个简单的整理与总结,记录一些自己思考的结论. 1.KPI万恶论 说KPI毁了索尼都是扯淡,很多大公司如BAT都在用KPI,发展有目共睹,虽然网上曝出各种弊端,但是没有KPI可能更差.企业的生老病死也是自然规律,更多是由外部的大趋势决定的,每次企业大规模的死亡与淘汰都是整个时代在飞速发展而进行正常的新陈

争议的编程观点(网摘)

1.   业余时间不会为了好玩而编程的程序员,永远比不上那些以编程为乐的同学. 我认为即使是最聪明.最有才华的人,如果只是将编程作为工作,也永远成不了真正优秀的程序员.以编程为乐的人会在业余时也搞些小项目,或者弄弄各种不同的编程语言和编程思想. 2.   单元测试无助于编写优秀代码. 编写单元测试的唯一理由仅仅是确保已经能工作的代码不会出问题.先写测试或者按测试来写代码是无比荒谬的.如果在代码之前写测试,你都不知道边 界情况是什么.虽然能让代码通过测试,但是在没有预见到的情况时还是会出问题.而且

那些争议最大的编程观点

编程相对来说是一门专业性非常强的技术工种,全世界也有大量的编程人员,每天都有人讨论什么编程语言最好,优秀程序员的标准等.接下来让我们来看看那些争议最大的编程观点. 1.   业余时间不会为了好玩而编程的程序员,永远比不上那些以编程为乐的同学. 我认为即使是最聪明.最有才华的人,如果只是将编程作为工作,也永远成不了真正优秀的程序员.以编程为乐的人会在业余时也搞些小项目,或者弄弄各种不同的编程语言和编程思想. 2.   单元测试无助于编写优秀代码. 编写单元测试的唯一理由仅仅是确保已经能工作的代码不

从StackOverflow来的值得回味的编程观点

从StackOverflow来的值得回味的编程观点 很多有意思的话语 在 2012年06月08日 那天写的     已经有 4148 次阅读了 感谢 参考或原文 www.csdn.net 服务器君一共花费了52.752 ms进行了2次数据库查询,努力地为您提供了这个页面. 试试阅读模式?希望听取您的建议 知名问答网站StackOverflow之所以成功,合理的规则与严格执行是重要的原因,所以删帖是经常的.不过有时候执行得过严了,被删的问答不时会有惊艳之作.这不,他们的博客8月29日的文章“20个

另眼相看“那些争议最大的编程观点”

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 有感于中国小孩背9x9乘法表,而印度小孩背19x19乘法表! 19x19 此类20以内乘法也很简单: 13 x 16 = 16 x 13 = 16

【效率】专为Win7系统设计的极简番茄计时器 - MiniPomodoro (附源码)

时光飞逝,一转眼坚持使用番茄工作法已经快3年了!能坚持这么长时间,主要还是得益于它的简单.但是令人纠结的是,这么长时间以来,换了7款不同的番茄计时器,仍然没有找到非常满意的: ■ 机械的噪音太大,会妨碍身边的同事,只能家里用.但是家里又太安静了,一旦响铃就跟晴天霹雳似的,把自己吓一跳. ■ 手机上的计时器 app 种类繁多,有偏重视觉效果的,有偏重任务管理的,有主打简单易用的,但是它们都有一个共同的缺点:不能保持屏幕常亮(太费电),时常会把它给忘了.另外怕影响同事一般都会把铃声关掉,只靠震动的话

FindChildControl与FindComponent

前两天编码遇到了要使用FindChildControl方法获取指定名称的TSpeedButton按钮,结果折腾了半天就是没得结果(基础不扎实,呵呵),于是赶紧搜索了下,补习关于这两个方法的用法. TWinControl类的FindChildControl方法在FWinControls中查找返回指定名称的可视且有窗体的组件(继承自TWinControl类).该方法可以确定当前控件是否含有(contain)指定名称的继承自TWinControl类的子控件,其结果与指定要查找的控件的Parent属性有