int i=3; printf("%d,%d,%d",i,i++,i++);结果是3,3,3,而int i=3; printf("%d,%d,%d",i+8,i+=5,i--);
2015-04-02 20:23
537 查看
http://zhidao.baidu.com/link?url=Vy-yASb2cE4LihdVaEpUqHkk-vMLZC141arTg4b61CHVL5dhqQKE81SyYcfJTvA15nsHRJsj40QlEEshHvjpIK
像这种计算循序的问题答案不是确定的,不同的编译器规定的计算循序是不一样的。你这个结果估计是在vc6.0上计算出来的,我用的是VS2012,得到的结果就和你的不一样。我得到的结果是5,4,3和17,9,5.有图有证据,图如下:
这样的题目很多,我教你一种分析的方法,以后碰到这样的题目就不怕了。
按F10进入调试状态;
在写代码的区域右键,选择转到反汇编;
看汇编是怎么写的一目了然。下面我把vs2012上反汇编出来的代码贴出来给你讲解一下。
我只分析了一部分,经过压栈操作,最后出来的数就是5,4,3了。第一个也类似分析。
会看汇编就容易多了。
像这种计算循序的问题答案不是确定的,不同的编译器规定的计算循序是不一样的。你这个结果估计是在vc6.0上计算出来的,我用的是VS2012,得到的结果就和你的不一样。我得到的结果是5,4,3和17,9,5.有图有证据,图如下:
这样的题目很多,我教你一种分析的方法,以后碰到这样的题目就不怕了。
按F10进入调试状态;
在写代码的区域右键,选择转到反汇编;
看汇编是怎么写的一目了然。下面我把vs2012上反汇编出来的代码贴出来给你讲解一下。
#include <stdio.h> int main() { push ebp mov ebp,esp sub esp,0D4h push ebx push esi push edi lea edi,[ebp-0D4h] mov ecx,35h mov eax,0CCCCCCCCh rep stos dword ptr es:[edi] int i = 3; mov dword ptr [i],3 //mov是移动指令,把3移到i中 printf("%d,%d,%d", i, i++, i++); mov eax,dword ptr [i] //把i(也就是3)移到eax寄存器中 mov dword ptr [ebp-0D0h],eax //把eax(即3)移到ebp-0D0h这个相对地址中 mov ecx,dword ptr [i] //把i(也就是3)移到ecx寄存器中 add ecx,1 //add是加指令,把ecx中的数值加1,即为4 mov dword ptr [i],ecx //把ecx(其值为4)移到i中 mov edx,dword ptr [i] //把i(也就是4)移到edx寄存器中 mov dword ptr [ebp-0D4h],edx //把edx(即4)移到ebp-0D4h这个相对地址中 mov eax,dword ptr [i] //把i(也就是4)移到eax寄存器中 add eax,1 //把eax中的数值加1,即eax中的值为5 mov dword ptr [i],eax //把eax(即5)移到i中 mov esi,esp mov ecx,dword ptr [ebp-0D0h] //移动ebp-0D0h地址中的值,即3到ecx push ecx //3压栈 mov edx,dword ptr [ebp-0D4h] //移动ebp-0D4h地址中的值,即4到edx push edx //4压栈 mov eax,dword ptr [i] //5移到eax中 push eax //5压栈 push 10C5858h call dword ptr ds:[10C92BCh] add esp,10h cmp esi,esp call __RTC_CheckEsp (010C113Bh) printf("\n"); mov esi,esp push 10C5FD8h call dword ptr ds:[10C92BCh] add esp,4 cmp esi,esp call __RTC_CheckEsp (010C113Bh) printf("%d,%d,%d", i + 8, i += 5, i--); mov eax,dword ptr [i] mov dword ptr [ebp-0D0h],eax mov ecx,dword ptr [i] printf("%d,%d,%d", i + 8, i += 5, i--); sub ecx,1 mov dword ptr [i],ecx mov edx,dword ptr [i] add edx,5 mov dword ptr [i],edx mov esi,esp mov eax,dword ptr [ebp-0D0h] push eax mov ecx,dword ptr [i] push ecx mov edx,dword ptr [i] add edx,8 push edx push 10C5858h call dword ptr ds:[10C92BCh] add esp,10h cmp esi,esp call __RTC_CheckEsp (010C113Bh) printf("\n"); mov esi,esp printf("\n"); push 10C5FD8h call dword ptr ds:[10C92BCh] add esp,4 cmp esi,esp call __RTC_CheckEsp (010C113Bh) return 0; xor eax,eax }
我只分析了一部分,经过压栈操作,最后出来的数就是5,4,3了。第一个也类似分析。
会看汇编就容易多了。
相关文章推荐
- printf("12345"+2) 结果
- C语言printf("%d",15.0/2)结果为0
- 【转】printf(&quot;%f/n&quot;,5)的输出结果为什么是0.000000
- printf("%d",5.01)和printf("%f",5)的输出结果
- printf("%d",5.01)和printf("%f",5)的输出结果
- 关于printf("%d,%d",m,m*m++);的输出结果,不管你知不知道,我之前反正不知道,偶然发现
- printf("%d",5.01)和printf("%f",5)的输出结果
- printf("%d",5.01)和printf("%f",5)的输出结果
- 结果是:空格空格3.0e+001,我不明白这加001是怎么回事啊?还有这个printf("%e\n",30.14);结果是3.014000e+001这是怎么算出来的?谁帮我讲下方法?
- printf("%d",5.01)和printf("%f",5)的输出结果
- printf("%d",5.01)和printf("%f",5)的输出结果
- char c=128; printf("c=%d\n",c); 结果为什么是-128
- 深度解析为何printf("%f",45);结果为零
- printf("%d",5.01)和printf("%f",5)的输出结果
- printf("%d\v",n);奇怪的输出结果
- baidu与goolge的“eclipse 输出文件夹"搜索结果
- printf("%d,%d,%d/n",a,++a,a++)
- C中对 printf("%.*s/n",len,content) 的意思理解。
- 提交一个from的时候,struts2处理完返回结果打开一个新页面,用target="blank"
- 从"aaskdaskasaskadaskkg"中删除"ask"得到结果"adasadkg"