首页
社区
课程
招聘
经典的老问题...
发表于: 2011-3-16 22:52 5584

经典的老问题...

2011-3-16 22:52
5584
还是关于自增运算的..
实例1:
int VALUE(int  a)
{
	return a;
}

 int a=5,b;
 b=(VALUE(++a))+(VALUE(++a))+(VALUE(a++));
 b=?

b的(理论)结果是多少?

实例2:
 int a=5,b;
 b=(++a)+(++a)+(a++);
 b=?

b的(理论)结果是多少?

请教各位牛牛,理论上的算法是怎么样的?值各是多少?
能说明下详细的过程更好..
都说是理论了..为神马还是有这么多人老是把他和编译器扯到一起说事..  从学术的角度,从逻辑算法的角度来看问题这样不好吗?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
实例2

++a表示先将a加1,再带入表达式运算,a++表示先将a带入表达式运算,再将a加1

b=6+7+7=20

a=8
2011-3-16 23:03
0
雪    币: 122
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
这个问题我认为没有太大的研究价值。不同的编译器有不同的做法。写代码的时候尽量不要写这些自己都看不懂的东西。
2011-3-16 23:31
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对于实例1:
我认为应该b的值是20
第一次++a传送给函数的a=6
第二次++a传送给函数的a=7
第三次a++传送给函数的a=7
所以b=6+7+7=20
2011-3-16 23:34
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看来论坛很多高人啊
2011-3-17 07:05
0
雪    币: 7113
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
编译器不同结果也不同的,楼主可以自己调试下就可以了啊!关键是明白自增和自减运算符的功能就OK了啊!
2011-3-17 07:33
0
雪    币: 220
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢楼上两位兄弟的提醒,我们只是想对理论上的逻辑算法进行讨论,暂抛开编译器不讲。
这个在不同的编译器确实值不同,甚至同一个编译器编译出来的DEBUG和RELEASE值都不同.
但是从理论的角度来看究竟是怎么样计算才是正确的?
2011-3-17 08:32
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
a=8 ,b=20
2011-3-17 09:40
0
雪    币: 220
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
奇怪...  为神马没人回答21...
2011-3-17 10:17
0
雪    币: 233
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个是编译器未定义行为,不同编译器结果不一样,这个没有研究价值,别钻牛角尖了
2011-3-17 10:25
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不必要围着细节追究
2011-3-19 19:50
0
雪    币: 39
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
int a=5,b;
b=(VALUE(++a))+(VALUE(++a))+(VALUE(a++));
b=?

->b=(VALUE(6)+VALUE(++a)+(VALUE(a++),此时a=6
->b=6+VALUE(7)+VALUE(a++),此时a=7
->b=6+7+VALUE(7),但此时a已经是8了。
所以结果:
b=6+7+7=20;

int a=5,b;
b=(++a)+(++a)+(a++);
b=?

->b=6+(++a)+(a++),此时a=6
->b=6+7+(a++),此时a=7
->b=6+7+7,此时a=8,但这条语句使用的a值是6
所以结果:
b=6+7+7=20

个人理解,请指教。
2011-3-22 15:40
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
b = 20;
a = 21;
2011-3-22 16:50
0
雪    币: 117
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
b=(++a)+(++a)+(a++);
00411A45  mov         eax,dword ptr [a]
00411A48  add         eax,1
00411A4B  mov         dword ptr [a],eax
00411A4E  mov         ecx,dword ptr [a]
00411A51  add         ecx,1
00411A54  mov         dword ptr [a],ecx
00411A57  mov         edx,dword ptr [a]
00411A5A  add         edx,dword ptr [a]
00411A5D  add         edx,dword ptr [a]
00411A60  mov         dword ptr ,edx
00411A63  mov         eax,dword ptr [a]
00411A66  add         eax,1
00411A69  mov         dword ptr [a],eax

vs2008翻译成这个,结果b是21
2011-3-22 17:25
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
15
不知道是从左往右算还是从右往左算的,,模糊了...从右往左的话,应该是这样

第一个b=8+7+6 = 21
第二个b=7+6+5 = 18

从左往右的话,应该是
b = 6+7+8 = 21
b = 6+7+7 = 20
个人观点......
2011-3-22 17:49
0
雪    币: 38
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
第一个问题,要取决于编译器,第二个问题,同第一个问题,如3楼所说。不要把自己不确定的东西让编译器来确定
2011-3-22 17:53
0
游客
登录 | 注册 方可回帖
返回
//