A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cjfire 中级黑马   /  2014-8-11 10:10  /  3537 人查看  /  33 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在视频中,讲到自增自减的时候,b = ++a,系统做了两步,一个是 a = a + 1;b = a;而b = a++,则是b = a; a = a + 1;
紧接着,视频又给出了一个例子,b = (a++) + (++a),请问这里有了小括号,编译器会怎样处理,都做了哪些工作?

33 个回复

倒序浏览
视频中既然给出来例子了,我很好奇视频中是怎么讲的,可否告知?关于b = (a++) + (++a)这种表达式,我之前写过一篇东西http://bbs.itheima.com/thread-128465-1-1.html
回复 使用道具 举报
这个比较深奥
回复 使用道具 举报
本帖最后由 朱亚男 于 2014-8-11 12:01 编辑

还是按老师讲的吧,百度一会我也迷糊了
回复 使用道具 举报
其实这个东西挺纠结的。我们再怎么想不如自己编个程序测试下。我还没看视频,在学校里学过,说下我的理解。b=(a++)+(++a),首先把第一个a 的值提出来运算,比如初值a=0,b=0.双目运算符+的左边就是0了,之后a的值自己加1,此时a的值是1了。再看++a,先把a的值加1再放到表达式里进行运算,a的值此时是2了,所以 b=0+2=2.最后a 和b 的值都是2.这是我测试过的,应该不会错。像这种式子我们学校老师说的是在开发中很少有人用的,纯粹是为了理解的。

点评

视频里,老师是这样讲的  发表于 2014-8-11 12:04
回复 使用道具 举报
王庆功 发表于 2014-8-11 11:57
其实这个东西挺纠结的。我们再怎么想不如自己编个程序测试下。我还没看视频,在学校里学过,说下我的理解。 ...

这还真是错的,因为你没有考虑表达式求值顺序。而C标准恰恰没有对表达式顺序做出一般规定

点评

长知识了,一个表达式还有这么多东西,非常感谢!二楼的贴子不错  发表于 2014-8-11 12:30
对的,android板块曾经有人发过多编译器的测试结果,都不一样的  发表于 2014-8-11 12:25
是不是这个表达式还有别的求值顺序,先算++a再算a+a再算a++?  发表于 2014-8-11 12:17
看2楼链接  发表于 2014-8-11 12:09
那对的是怎样?求解释  发表于 2014-8-11 12:09
回复 使用道具 举报
cjfire 中级黑马 2014-8-11 12:30:23
7#
fantacyleo 发表于 2014-8-11 12:07
这还真是错的,因为你没有考虑表达式求值顺序。而C标准恰恰没有对表达式顺序做出一般规定 ...

他这个哪里错了呢?我没看出来
回复 使用道具 举报
cjfire 发表于 2014-8-11 12:30
他这个哪里错了呢?我没看出来

你说的这个题,其实对不同的编译器是会有不同答案的,见我2楼的链接。所以我很好奇既然视频里举出了这个例子,到底是怎么解答的。
回复 使用道具 举报 1 0
本帖最后由 fantacyleo 于 2014-8-11 12:46 编辑

看看某位同学的测试结果:http://bbs.itheima.com/thread-129127-1-1.html 三种C编译器,三个不同的结果,很震撼
回复 使用道具 举报
fantacyleo 发表于 2014-8-11 12:43
看看某位同学的测试结果:http://bbs.itheima.com/thread-129127-1-1.html 三种C编译器,三个不同的结果, ...

就是说,答案是多少,取决于编译器。就怕面试的时候,出现这样的题目
回复 使用道具 举报
cjfire 发表于 2014-8-11 13:06
就是说,答案是多少,取决于编译器。就怕面试的时候,出现这样的题目

那也没什么,直截了当告诉面试老师实际情况就是这样。
回复 使用道具 举报
cjfire 发表于 2014-8-11 13:06
就是说,答案是多少,取决于编译器。就怕面试的时候,出现这样的题目

确实是根据编译器来,我记得有次参加一个竞赛,一道逻辑运算的题目,TC和VC6.0编译结果都不一样,写答案的时候都得注明是用的哪种编译器
回复 使用道具 举报
这个比较难,要好好思考
回复 使用道具 举报
b=(a++)+(++a):如果a=3。第一步:(a++):括号内是一个整体,先算出来,a==4;第二步:(++a):括号内是一个整体,先算出来,a==5;第三步: b=()+ ():b=4+5;则 b==9;
回复 使用道具 举报
ccq 中级黑马 2014-8-11 16:35:33
15#
其实也不难理解,看编译器顺序了,从左到右就先进行a++,然后再进行++a了,如果是从右向左,就是先执行++a,再执行a++。
回复 使用道具 举报
本帖最后由 Jr_711 于 2014-8-12 19:32 编辑

b=(a++)+(++a)


1>首先,内存只会一步一步运算,每进行一步,内存内的值都可能改变
2>然后,要把a++和++a各当做一个整体来看,
        并理解a++是先使用后加一(影响下次使用),
              ++a是先加一再使用(影响本次使用),
3>计算右边式子,并根据运算符优先级,由左向右计算
4>先算第一个括号,假设初始值a=10,则第一个括号内结果就是a的原值a=10
此时内存中a因为使用a++,使得a的值在使用之后发生改变,a=10+1=11,即此时打印a的话,a=11
5>再算第二个括号,已知现在a=11,这里调用++a,先加一后使用,即括号内结果是a=11+1=12
此时内存中a因为使用++a,a的值再加1,a=12,再使用,即此时打印a的话,a=12
6>赋值给左边:(假设a=10)
   b=(a++)+(++a)=10+12=22



以上是我个人的理解,哪里不对还望指正。

点评

http://bbs.itheima.com/thread-128465-1-1.html  发表于 2014-8-11 22:41
回复 使用道具 举报
fantacyleo 发表于 2014-8-11 13:09
那也没什么,直截了当告诉面试老师实际情况就是这样。

可以加你为好友不?有事想请教你一下。
回复 使用道具 举报

解释得很详细易懂!!:handshake
回复 使用道具 举报

我觉得层主把a++和++a搞反了,b=(a++)+(++a),第一个括号内是(a=10),这时还没有执行a+1,到第二个括号时a=11,(++a)->a=12,最后结果是b=10+12=22;
感觉层主说的情况是b=(++a)+(a++)这种,并且按照14楼的说法,b=(a++)+(++a)用Xcode算出来应该是b=8,而不是9,第一个括号a=3,第二个括号a=4+1=5,这样看来b=(++a)+(a++),也是b=8,刚好吻合
回复 使用道具 举报 1 0
从今以后 发表于 2014-8-12 14:05
我觉得层主把a++和++a搞反了,b=(a++)+(++a),第一个括号内是(a=10),这时还没有执行a+1,到第二个括号 ...

确实搞反了,恍惚了,还是用的不够多,没感觉到是,这次又加深次印象,实在在太感谢了!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马