鱼C论坛

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

自加自减p=(++j)+(++j)+(++j) 求p

[复制链接]
发表于 2012-2-26 10:42:22 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 鱼C海星 于 2012-2-26 17:20 编辑

(省);
int j=5;
p=(++j)+(++j)+(++j);
printf("%d",p);
这道题好像老师没有讲到,按我的理论计算方法,好像是6+7+8=21的,可是编译却显示了22,为什么?(求助中)对所有好心人衷心感谢。


(已解决)感谢各位的回答,虽然自己生硬地理清思路,不过就不知道是否正确了。

最佳答案

查看完整内容

查了一下书。 ++的优先级比+高,且结合方向为自右至左。 先处理p=(++j)+(++j)+(++j)右边的(++j)+(++j)且处理两次(理由上面那句话),得到j=7,那么(++j)+(++j)=7+7=14,最后处理左边的++j,最后p=8+7+7=22 可参考:1、 http://zhidao.baidu.com/question/24618665.html?fr=qrl&cid=87&index=1&fr2=query 2、http://zhidao.baidu.com/question/24617811.html?fr=qrl&cid=83&index=1 建议的话:C++标准对表 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-26 10:42:23 | 显示全部楼层
查了一下书。
++的优先级比+高,且结合方向为自右至左。
先处理p=(++j)+(++j)+(++j)右边的(++j)+(++j)且处理两次(理由上面那句话),得到j=7,那么(++j)+(++j)=7+7=14,最后处理左边的++j,最后p=8+7+7=22

可参考:1、 http://zhidao.baidu.com/question/24618665.html?fr=qrl&cid=87&index=1&fr2=query

             2、http://zhidao.baidu.com/question/24617811.html?fr=qrl&cid=83&index=1

建议的话:C++标准对表达式求值的顺序,并无统一规定,在求解一般表达式时不会发生歧义,而在求解含++和--运算符时会出现歧义,在不同系统中可能得到不同的结果。大多数专家和专业人员都已充分认识到自增运算符++和自减运算符--的副作用对程序设计的危害性,主张不要过多地依赖使用++和--运算符的技巧,要遵循易于理解的原则。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 12:44:08 | 显示全部楼层
int j = 5, p;
0040B7A8   mov         dword ptr [ebp-4],5

p = (++j) + (++j) + (++j);
0040B7AF   mov         eax,dword ptr [ebp-4]        ;eax=5
0040B7B2   add         eax,1                        ;eax=6;
0040B7B5   mov         dword ptr [ebp-4],eax        ;把eax的值传回j申请的内存地址,j=6

0040B7B8   mov         ecx,dword ptr [ebp-4]        ;ecx=j, ecx=6;
0040B7BB   add         ecx,1                        ;ecx=7
0040B7BE   mov         dword ptr [ebp-4],ecx        ;把ecx的值传回j申请的内存地址;

0040B7C1   mov         edx,dword ptr [ebp-4]        ;edx=7          不明白编译器为何这么做!
0040B7C4   add         edx,dword ptr [ebp-4]        ;edx=14;

0040B7C7   mov         eax,dword ptr [ebp-4]        ;eax=7;
0040B7CA   add         eax,1                        ;eax=8;
0040B7CD   mov         dword ptr [ebp-4],eax        ;j=8;
0040B7D0   add         edx,dword ptr [ebp-4]        ;edx=22;
0040B7D3   mov         dword ptr [ebp-8],edx        ;把edx的值传入p,因为int占四字节,所以p的内存地址为[ebp-8]

这是反汇编的代码,有两句不明白。不知道编译器为何那样做。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 12:47:43 | 显示全部楼层
据我所知,关于自增自减问题,在不同的编译器中实现的结果是不一样的。
所以楼主不必一直纠结于这个问题。
自加自减只是为了写代码时方便一点,不是为了耍帅卖关子。
而且在实际操练过程,基本不会有程序员这么写代码的。
我们只要知道自加自减的基本原理就行了。
听哥的,绕过它,继续往前走吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-26 13:45:04 | 显示全部楼层

嗯,我还是留着问题吧,继续听课先,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 14:24:44 | 显示全部楼层
VS2010下怎么等于24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 15:59:55 | 显示全部楼层
这个问题太深奥了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 16:02:32 | 显示全部楼层
Sabo 发表于 2012-2-26 12:44
int j = 5, p;
0040B7A8   mov         dword ptr [ebp-4],5

天啊看的眼都花了我也不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-26 16:59:56 | 显示全部楼层
gj113669 发表于 2012-2-26 14:24
VS2010下怎么等于24

````,还挺无语的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 17:17:13 | 显示全部楼层
这种多层自加的结果依赖编译器,可以说是错误的语法
以后不要用这种语法,也不要纠结它的结果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-26 17:36:24 | 显示全部楼层
本帖最后由 gj113669 于 2012-2-26 17:39 编辑
鱼C海星 发表于 2012-2-26 16:59
````,还挺无语的

第一个++J是J=5自加1后为6,第二个++J是J为6时再加1等于7,第三个++j 是 j为7时再加1 等于8,跟据编器不同,计算结果有的为22,有的为24,其原因第一种是(++j)+(++j) 当计算至第二个J时的值为7,那么编译器认为第一个++J的J的值也为7,前两个++J的值都为7所以7+7等于14,再加上最后一个++J就等于14+8=22;还有一种结果是24的是因为编译器把所有的++J的值都算完,然后取最后一个++J的J的值再把3个J相加就成了8+8+8=24,因为最后个++J的J的值为8;

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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