自加自减问题

silence00 2008-10-24 10:50:25
i=3;
a=(i++)+(i++)+(i++);
b=(++i)+(++i)+(++i);
printf("a=%d b=%d",a,b)
我看到过有关大家对这个问题的讨论,但是众说风云,答案基本上是说a=9,但是b等于什么的都有,但是却没有一个人说在visual c++6.0里面b=25,我不知道为什么b会等于25,求助!!!!!
...全文
211 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
rzzat1478 2008-10-25
  • 打赏
  • 举报
回复
顶9L
太乙 2008-10-25
  • 打赏
  • 举报
回复


此时:i=6;没意见吧?
继续:


6: int b=(++i)+(++i)+(++i);
00401056 mov ecx,dword ptr [ebp-4]
00401059 add ecx,1
0040105C mov dword ptr [ebp-4],ecx
上面是计算++i;
i=7;
0040105F mov edx,dword ptr [ebp-4]
00401062 add edx,1
00401065 mov dword ptr [ebp-4],edx
上面是计算++i;
i=8;
00401068 mov eax,dword ptr [ebp-4]
0040106B add eax,dword ptr [ebp-4]
i+i = 8+8 = 16
0040106E mov ecx,dword ptr [ebp-4]
00401071 add ecx,1
00401074 mov dword ptr [ebp-4],ecx
上面是计算++i;
i= 9
00401077 add eax,dword ptr [ebp-4]
16+9 = 25

太乙 2008-10-25
  • 打赏
  • 举报
回复



4: int i=3;
00401028 mov dword ptr [ebp-4],3
5: int a=(i++)+(i++)+(i++);
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,dword ptr [ebp-4]
00401035 add eax,dword ptr [ebp-4]
00401038 mov dword ptr [ebp-8],eax
0040103B mov ecx,dword ptr [ebp-4]
0040103E add ecx,1
00401041 mov dword ptr [ebp-4],ecx
00401044 mov edx,dword ptr [ebp-4]
00401047 add edx,1
0040104A mov dword ptr [ebp-4],edx
0040104D mov eax,dword ptr [ebp-4]
00401050 add eax,1
00401053 mov dword ptr [ebp-4],eax
6: int b=(++i)+(++i)+(++i);
00401056 mov ecx,dword ptr [ebp-4]
00401059 add ecx,1
0040105C mov dword ptr [ebp-4],ecx
上面是计算++i;
0040105F mov edx,dword ptr [ebp-4]
00401062 add edx,1
00401065 mov dword ptr [ebp-4],edx
上面是计算++i;
00401068 mov eax,dword ptr [ebp-4]
0040106B add eax,dword ptr [ebp-4]
i+i
0040106E mov ecx,dword ptr [ebp-4]
00401071 add ecx,1
00401074 mov dword ptr [ebp-4],ecx
上面是计算++i;
00401077 add eax,dword ptr [ebp-4]

再+i

0040107A mov dword ptr [ebp-0Ch],eax



  • 打赏
  • 举报
回复

没意义...工作中肯定不会写这样的代码..
BLEACH13 2008-10-25
  • 打赏
  • 举报
回复
晕,以后写程序不要写出这种!!!这都叫引起歧义的程序!!!!在不同的编译系统,它的结果都是不同的!!!!
wenjunsu 2008-10-25
  • 打赏
  • 举报
回复
++i的意思是先让变量加1,然后让变量参与运算!
i++的意思是先参与运算,再让变量加1!

LZ注意:此题的i每次自加之后,新的数值都会替代旧的,所以i会越来越大!

就是这些!我顶了!
wenjunsu 2008-10-25
  • 打赏
  • 举报
回复
这还不够简单!写个小程序,让它输出就知道了!
a=9,b=25!
就这样的!我的编译器是这样告诉我的!
frank_ll 2008-10-25
  • 打赏
  • 举报
回复
又见复仇题
jackzhhuang 2008-10-25
  • 打赏
  • 举报
回复
忘了算a了

算上a,应该是

a = 9
b = 27

建议别钻这个牛角尖,在实际中写这种代码肯定被人骂的。
jackzhhuang 2008-10-25
  • 打赏
  • 举报
回复
b=(++i)+(++i)+(++i);
根据编译器的不同会不同的。

我在vs2008下得18
太乙 2008-10-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tlw112 的回复:]
编译器给我的答案是
a=9 b=27
[/Quote]

不同 的编译器不同,我给出的是lz想要的答案,
你可以反汇编一下你的代码,看看执行过程!
tlw112 2008-10-25
  • 打赏
  • 举报
回复
编译器给我的答案是
a=9 b=27
piginthetree 2008-10-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 HotHat 的回复:]
不同的编译器有不同的结果吧.
自己最好不要这样用。
[/Quote]
同意。
HotHat 2008-10-25
  • 打赏
  • 举报
回复
不同的编译器有不同的结果吧.
自己最好不要这样用。
Big鹏 2008-10-25
  • 打赏
  • 举报
回复

主要讲:
b=(++i)+(++i)+(++i);
//首先,++6=7,然后,++7=8 为什么这样呢?因为++的优先级比()要高,由于i保存最后一次的取值,所以:
//应该为8+8=16(注意:这时编译器就要算出结果来的)。最后,16+(++8)=16+9=25。
//就是这样的,楼主明白了么?!呵呵
Big鹏 2008-10-25
  • 打赏
  • 举报
回复

噢,明白了,跟运算符优先级有关,先加后()。
Big鹏 2008-10-25
  • 打赏
  • 举报
回复

弱弱地问一下,为什么:
i=7;
0040105F mov edx,dword ptr [ebp-4]
00401062 add edx,1
00401065 mov dword ptr [ebp-4],edx
上面是计算++i;
i=8;
00401068 mov eax,dword ptr [ebp-4]
0040106B add eax,dword ptr [ebp-4]
i+i = 8+8 = 16 //而不是7+8呢??

帅得不敢出门 2008-10-24
  • 打赏
  • 举报
回复
看汇编实现最清楚了
emailtome 2008-10-24
  • 打赏
  • 举报
回复
如果面试出这个题 不就和面试官说 fuck you asshole
wuyu637 2008-10-24
  • 打赏
  • 举报
回复
vc6 而且是++的沙发。。。

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧