黑马程序员技术交流社区

标题: a++和++a的问题 [打印本页]

作者: cjfire    时间: 2014-8-11 10:10
标题: a++和++a的问题
在视频中,讲到自增自减的时候,b = ++a,系统做了两步,一个是 a = a + 1;b = a;而b = a++,则是b = a; a = a + 1;
紧接着,视频又给出了一个例子,b = (a++) + (++a),请问这里有了小括号,编译器会怎样处理,都做了哪些工作?
作者: fantacyleo    时间: 2014-8-11 10:54
视频中既然给出来例子了,我很好奇视频中是怎么讲的,可否告知?关于b = (a++) + (++a)这种表达式,我之前写过一篇东西http://bbs.itheima.com/thread-128465-1-1.html
作者: Franklin    时间: 2014-8-11 11:27
这个比较深奥
作者: 朱亚男    时间: 2014-8-11 11:49
本帖最后由 朱亚男 于 2014-8-11 12:01 编辑

还是按老师讲的吧,百度一会我也迷糊了
作者: 王庆功    时间: 2014-8-11 11:57
其实这个东西挺纠结的。我们再怎么想不如自己编个程序测试下。我还没看视频,在学校里学过,说下我的理解。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.这是我测试过的,应该不会错。像这种式子我们学校老师说的是在开发中很少有人用的,纯粹是为了理解的。
作者: fantacyleo    时间: 2014-8-11 12:07
王庆功 发表于 2014-8-11 11:57
其实这个东西挺纠结的。我们再怎么想不如自己编个程序测试下。我还没看视频,在学校里学过,说下我的理解。 ...

这还真是错的,因为你没有考虑表达式求值顺序。而C标准恰恰没有对表达式顺序做出一般规定
作者: cjfire    时间: 2014-8-11 12:30
fantacyleo 发表于 2014-8-11 12:07
这还真是错的,因为你没有考虑表达式求值顺序。而C标准恰恰没有对表达式顺序做出一般规定 ...

他这个哪里错了呢?我没看出来
作者: fantacyleo    时间: 2014-8-11 12:31
cjfire 发表于 2014-8-11 12:30
他这个哪里错了呢?我没看出来

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

看看某位同学的测试结果:http://bbs.itheima.com/thread-129127-1-1.html 三种C编译器,三个不同的结果,很震撼
作者: cjfire    时间: 2014-8-11 13:06
fantacyleo 发表于 2014-8-11 12:43
看看某位同学的测试结果:http://bbs.itheima.com/thread-129127-1-1.html 三种C编译器,三个不同的结果, ...

就是说,答案是多少,取决于编译器。就怕面试的时候,出现这样的题目
作者: fantacyleo    时间: 2014-8-11 13:09
cjfire 发表于 2014-8-11 13:06
就是说,答案是多少,取决于编译器。就怕面试的时候,出现这样的题目

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

确实是根据编译器来,我记得有次参加一个竞赛,一道逻辑运算的题目,TC和VC6.0编译结果都不一样,写答案的时候都得注明是用的哪种编译器
作者: Justfeeling    时间: 2014-8-11 14:47
这个比较难,要好好思考
作者: 陆习康    时间: 2014-8-11 14:57
b=(a++)+(++a):如果a=3。第一步:(a++):括号内是一个整体,先算出来,a==4;第二步:(++a):括号内是一个整体,先算出来,a==5;第三步: b=()+ ():b=4+5;则 b==9;

作者: ccq    时间: 2014-8-11 16:35
其实也不难理解,看编译器顺序了,从左到右就先进行a++,然后再进行++a了,如果是从右向左,就是先执行++a,再执行a++。
作者: Jr_711    时间: 2014-8-11 22:23
本帖最后由 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



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


作者: claud0623    时间: 2014-8-11 23:45
fantacyleo 发表于 2014-8-11 13:09
那也没什么,直截了当告诉面试老师实际情况就是这样。

可以加你为好友不?有事想请教你一下。
作者: 山涧小草    时间: 2014-8-12 01:09
Jr_711 发表于 2014-8-11 22:23
b=(a++)+(++a)

解释得很详细易懂!!:handshake
作者: 从今以后    时间: 2014-8-12 14:05
Jr_711 发表于 2014-8-11 22:23
b=(a++)+(++a)

我觉得层主把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,刚好吻合
作者: Jr_711    时间: 2014-8-12 19:34
从今以后 发表于 2014-8-12 14:05
我觉得层主把a++和++a搞反了,b=(a++)+(++a),第一个括号内是(a=10),这时还没有执行a+1,到第二个括号 ...

确实搞反了,恍惚了,还是用的不够多,没感觉到是,这次又加深次印象,实在在太感谢了!
作者: Jr_711    时间: 2014-8-12 19:36
山涧小草 发表于 2014-8-12 01:09
解释得很详细易懂!!

呵呵  惭愧,原来把a++和++a搞反了 , 现在改过来了
作者: 卡尔    时间: 2014-8-14 15:36
Jr_711 发表于 2014-8-12 19:36
呵呵  惭愧,原来把a++和++a搞反了 , 现在改过来了

在没翻页之前我还一直纠结推荐答案和说你的答案搞混了,原来你已经重新编辑了。。
作者: Meniny    时间: 2014-8-14 20:50
这个应该和编译器有关系吧,以前试过貌似编译器不同结果也会不同
作者: 3677065    时间: 2014-8-14 22:25
这个问题也在困扰着我
作者: ❤如止水之絕境    时间: 2014-8-15 11:42
b = (a++)+(++a),编译器会首先执行括号中的,然后在计算左边这个+,然后在计算=
作者: 叮当    时间: 2014-9-4 20:37
学这个的时候,一会明白一会不明白,弄得有点晕
作者: 肖伟    时间: 2014-9-8 10:01
Jr_711 发表于 2014-8-11 22:23
b=(a++)+(++a)

受教啦.......




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2