欢迎来到天天文库
浏览记录
ID:18247282
大小:198.44 KB
页数:10页
时间:2018-09-15
《[++i 与i++]一道简单的题目引发的思考》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一道简单的题目引发的思考++i与i++——Don'tbelieveinmagic!Understandwhatyourprogramdo,howtheydo.引言昨晚一时兴起,我脑子就问自己下面的代码会输出什么,也不知道我脑子为什么有这个代码模型,只是模糊的有些印象:01#include02#include03 04intmain(intargc,char**argv)05{06 inti=3,j;07 j=(i++)+(i++)+(++i);08 printf("i
2、=%d,j=%d",i,j);09 exit(0);10}您会怎样考虑这个问题呢?您不运行这个程序能准确地说出答案吗?我猜想肯定有大部分人不能肯定且准确地说出答案!如果您不能,这篇文章就是为你准备的,保证您看完之后豁然开朗!请细看下文,outline如下:1、诸君的回答我那这道题目问了几个人,他们的答案不尽相同。1.1、A君的回答good,noloosening.6.5.2DCSsidewiringtocompletetheenclosureandtheothersideafterthewiringiscomple
3、ted,DCSwithintheenclosurewhenthepowermoduleshouldbeloosenedorthepowergoesout.6.6lowvoltagecableterminalmaking6.6.1first因为i=3,故依次i++=4,i++=5,++i=6,i最后输出为i=6;但是由于前面两个++是后置++,最后一个++是前置++,故j=3+4+6=13。1.2、B君的回答因为i=3,故第一个i++后为4,第二个i++后为5,接着做i+i操作=5+5=10,最后与(++i)相加=10+6=1
4、6。1.3、C君的回答因为i=3,故依次i++=4,i++=5,++i=6,i最后输出为i=6;但是第一i、第二个i的++是后置++,先进行i+i操作,然后进行两次i++后置操作,故等价于(i)+(i)=3+3=6,i++,i++,最后与++i=6相加等于12。1.4、D君的回答因为i=3,故依次i++=4,i++=5,++i=6,i最后输出为i=6;但是前面两个++都是后置++,故先做i+i+(++i)操作,然后才在i++,i++操作,第三个++是前置++,故等价于i+i+(++i)=3+3+4=10,i++,i++。到底
5、哪个人说得对呢?2、编译器的输出首先让我们先来看看编译器会输出什么?2.1、VisualStudio的输出运行环境:Win7+VS2005orVS2010,输出如下图所示:good,noloosening.6.5.2DCSsidewiringtocompletetheenclosureandtheothersideafterthewiringiscompleted,DCSwithintheenclosurewhenthepowermoduleshouldbeloosenedorthepowergoesout.6.6lowvo
6、ltagecableterminalmaking6.6.1first2.2、GCC的输出运行环境:Ubuntu10.04+gcc(Ubuntu4.4.3-4ubuntu5)4.4.3,运行结果如下:2.3、VisualC++的输出运行环境:Win7+VC2010,输出和VS一样,及i=6&j=12看到这里你肯定想问why?why??why???3、分析重编译器的输出结果来看貌似C君、D君的分析都是对的,这种差异跟编译器有直接的关系,因为对于这个表达式怎么编译还没有形成标准,编译器的结合方向不同,答案因此会有所不同。而且当然还
7、包括运算符的优先级等。其实顶多算C君答对了一部分,其他几个人的回答都是错的,详情见下面的分析。3.1、gcc编译器上的分析(i++)+(i++)+(++i)<=>i+i+(++i);i++;i++;即如果表达式中含有i++,一律替换成i,然后在表达式之后进行i++操作。这样的话上面的代码就可以很好的理解了,即3+3+4=10。good,noloosening.6.5.2DCSsidewiringtocompletetheenclosureandtheothersideafterthewiringiscompleted,DCS
8、withintheenclosurewhenthepowermoduleshouldbeloosenedorthepowergoesout.6.6lowvoltagecableterminalmaking6.6.1first3.2、分析gcc编译之后的汇编代码可以对gcc编译之后的执行文件
此文档下载收益归作者所有