鱼C论坛

 找回密码
 立即注册
查看: 3798|回复: 10

视频中没有理解的 大神们 帮帮了

[复制链接]
发表于 2013-9-20 13:32:16 | 显示全部楼层 |阅读模式
1鱼币
#include  "stdio.h"
void  main()
{
   int  i=5,j=5,p,q;
   p=(i++)+(i++)+(i++);
   q=(++j)+(++j)+(++j);
   printf("%d,%d,%d,%d",p,q,i,j);
}


为什么  q 会等于22 呢   不是21么??  想了好久   脑子不够用 啊  大神指点! 分析一下

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-20 17:03:34 | 显示全部楼层
又是这种除了应付考试外什么用都没有的程序:shock:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-20 17:04:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-20 17:55:51 | 显示全部楼层
大概是这样的
用VC中的debug反汇编:
q=(++j)+(++j)+(++j);
0040102F   mov         eax,dword ptr [ebp-4]  //把j的值传到寄存器EAX,dword ptr [ebp-4]存放的是变量j
00401032   add         eax,1                  //EAX加1
00401035   mov         dword ptr [ebp-4],eax   //EAX的值传到变量j,这两步实现第一个++j,此时j=6
00401038   mov         ecx,dword ptr [ebp-4]   //把j的值传到寄存器ECX
0040103B   add         ecx,1                   //ECX加1
0040103E   mov         dword ptr [ebp-4],ecx   //ECX的值传到变量j,这两步实现第二个++j,此时j=7
00401041   mov         edx,dword ptr [ebp-4]    //把变量j传到EDX
00401044   add         edx,dword ptr [ebp-4]    //再加上j的值,这一步实现了第一个加号的加法运算,内存中j变量的值仍是7
00401047   mov         eax,dword ptr [ebp-4]    //把j的值传到寄存器EAX
0040104A   add         eax,1                    //EAX加1
0040104D   mov         dword ptr [ebp-4],eax    //把EAX的值传送到变量j中,此时,变量j在内存中的值是8
00401050   add         edx,dword ptr [ebp-4]    //EDX加上j的值,EDX中存放的是前面的第一个加法运算的结果14,最后EDX的值为22
00401053   mov         dword ptr [ebp-8],edx    //把运算结果传到内存中变量q的地方,所以最后变量q为22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-20 17:56:01 | 显示全部楼层
      对于C/C++,在一个表达式中如果读了一个变量两次以上的,并且同时对它进行了写操作,那么结果就是未定义的,具体与编译器有关。建议你不要深究这种题目,每人会写这样的程序,除了某些变态的考官。
你可以用TC、VC6.0、VS2010试试,结果是不一样的。
对于vc6.0是先算前2个,然后剩下的一个一个算,然后相加。
再不懂可以调试看看他的汇编。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-20 17:59:41 | 显示全部楼层
诶  这玩意 你换个编译器结果就会不同的  可以说除了应付考试 其他没什么用处  楼主你纠结他干嘛啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-20 21:00:14 | 显示全部楼层
你需要知道的是运算优先顺序,这样的问题在不同的调试软件中会出来不同的结果的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-21 18:00:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-21 18:20:47 | 显示全部楼层
正在写代码 发表于 2013-9-20 17:55
大概是这样的
用VC中的debug反汇编:
q=(++j)+(++j)+(++j);

你这是VC6?GCC是这么处理的。但是VS2012却是这么处理的:
    q = (++j) + (++j) + (++j);
000D3C43  mov         eax, dword ptr [j]  
000D3C46  add         eax, 1  
000D3C49  mov         dword ptr [j],eax  
000D3C4C  mov         ecx,dword ptr [j]  
000D3C4F  add         ecx,1  
000D3C52  mov         dword ptr [j],ecx  
000D3C55  mov         edx,dword ptr [j]  
000D3C58  add         edx,1  
000D3C5B  mov         dword ptr [j],edx  
000D3C5E  mov         eax,dword ptr [j]  
000D3C61  add         eax,dword ptr [j]  
000D3C64  add         eax,dword ptr [j]  
000D3C67  mov         dword ptr [q],eax  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-21 19:35:21 | 显示全部楼层
Drunkメ逍遥彡 发表于 2013-9-21 18:20
你这是VC6?GCC是这么处理的。但是VS2012却是这么处理的:
    q = (++j) + (++j) + (++j);
000D3C43   ...

不同的编译器确实是不一样的,这种东西其实真没必要深究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-25 10:27:29 | 显示全部楼层
{:1_1:}新人,来看学习的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表