一道简单的题目引发的思考.doc

一道简单的题目引发的思考.doc

ID:58847760

大小:5.16 MB

页数:11页

时间:2020-10-25

一道简单的题目引发的思考.doc_第1页
一道简单的题目引发的思考.doc_第2页
一道简单的题目引发的思考.doc_第3页
一道简单的题目引发的思考.doc_第4页
一道简单的题目引发的思考.doc_第5页
资源描述:

《一道简单的题目引发的思考.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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    pri

2、ntf("i=%d,j=%d",i,j);09    exit(0);10}您会怎样考虑这个问题呢?您不运行这个程序能准确地说出答案吗?我猜想肯定有大部分人不能肯定且准确地说出答案!如果您不能,这篇文章就是为你准备的,保证您看完之后豁然开朗!请细看下文,outline如下:.word.…...…1、诸君的回答我那这道题目问了几个人,他们的答案不尽相同。1.1、A君的回答因为i=3,故依次i++=4,i++=5,++i=6,i最后输出为i=6;但是由于前面两个++是后置++,最后一个++是前置++,故j=3+4+6=1

3、3。1.2、B君的回答因为i=3,故第一个i++后为4,第二个i++后为5,接着做i+i操作=5+5=10,最后与(++i)相加=10+6=16。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;但是前面两个++都是后置++,

4、故先做i+i+(++i)操作,然后才在i++,i++操作,第三个++是前置++,故等价于i+i+(++i)=3+3+4=10,i++,i++。到底哪个人说得对呢?2、编译器的输出.word.…...…首先让我们先来看看编译器会输出什么?2.1、VisualStudio的输出运行环境:Win7+VS2005orVS2010,输出如下图所示:2.2、GCC的输出运行环境:Ubuntu10.04+gcc(Ubuntu4.4.3-4ubuntu5)4.4.3,运行结果如下:2.3、VisualC++的输出运行环境:Win7+VC

5、2010,输出和VS一样,及i=6&j=12看到这里你肯定想问why?why??why???3、分析重编译器的输出结果来看貌似C君、D君的分析都是对的,这种差异跟编译器有直接的关系,因为对于这个表达式怎么编译还没有形成标准,编译器的结合方向不同,答案因此会有所不同。而且当然还包括运算符的优先级等。其实顶多算C君答对了一部分,其他几个人的回答都是错的,详情见下面的分析。3.1、gcc编译器上的分析.word.…...…(i++)+(i++)+(++i)<=>i+i+(++i);i++;i++;即如果表达式中含有i++,一律

6、替换成i,然后在表达式之后进行i++操作。这样的话上面的代码就可以很好的理解了,即3+3+4=10。3.2、分析gcc编译之后的汇编代码可以对gcc编译之后的执行文件进行反编译分析验证正确性。在Linux下面可以用objdump–dxxx(执行文件)命令反汇编执行文件。反编译之后可以看到如下图所示的代码:说明:Linux下采用的是AT&T的汇编语法格式,Windows下面采用的是Intel汇编语法格式。二者的主要区别在于:.word.…...…1.指令操作数的赋值方向是不同的  Intel:第一个是目的操作数,第二个是源

7、操作数  AT&T:第一个是源操作数,第二个是目的操作数2.指令前缀  AT&T:寄存器前边要加上%,立即数前要加上$  Intel:没有这方面的要求3.存单元操作数  Intel:基地址使用[]  AT&T: 基地址使用() 比如:intel中 mov ax,[bx]             AT&T中movl(%eax),%ebx4.操作码的后缀    AT&T中操作码后面有一个后缀字母:“l”32位,“w”16位,“b”8位    Intel却使用了在操作数前面加dwordptr,wordptr,byteptr的格

8、式  例如:moval,bl(Intel)            movb%bl%al(AT&T)5.AT&T中跳转指令标号后的后缀表示跳转方向,“f”表示向前,“b”表示向后下面我们重点分析红框中的代码:movl $0x3,0x1c(%esp):将3赋给i,即i=3mov  0x1c(%esp),%eax:将esp

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。