黑马程序员技术交流社区

标题: (求助求助)跪求大神变态详解++在前和在后的区别(万分... [打印本页]

作者: ehehe    时间: 2015-8-25 00:07
标题: (求助求助)跪求大神变态详解++在前和在后的区别(万分...
这个问题总是搞不懂,虽然知道如果在前的话是先+1再运算,在后是先运算再+的这个规律,但总觉得太绕了
举个栗子:a=3;b=4;c=5;a=b++;b=++c;c=a--;分别输出a b c的结果是3 6 4,,而我的想法是首先a=b++
因为++在后面,所以先把b的值赋给a然后再b+1,这时候a=4,b=5,接着b=++c,因为++在前面所以先c+1在把值赋给b,这时b=6,c=6,
最后c=a--,那就是c=4,总结就是a=4,b=6,c=4.我要问的就是为什么我算出a的值为4而不是3,一直都搞不懂这个,求助求助
作者: kingkeykang    时间: 2015-8-25 00:58
你逗了吧!c=a_--运算之前a=4这样先把4赋给才c  ,a再自减 a=3,你分析这么好到后面一歩就搞不清了?
作者: llwhcm    时间: 2015-8-25 01:00
你前面定义了a=b++,a的值变成了b付给的4,最后定义的是c=a--,c=a--此时a值为4赋值给c,然后值为4的a又进行了--的运算所有,4-1=3。
简单的说就是最后a--你没算
作者: 虫虫同学    时间: 2015-8-25 07:32
像c=a--;这种赋值语句, Java编译器每次遇到自增、自减运算符的时候都会开辟一块新的内存空间来保存赋值之前a的值,然后再将这个换成变量的值赋给左边的变量。从你的分析上来看你对自增、自减运算符理解的挺好的,究竟是先用原值进行计算再减一,还是先减一再进行运算是这类题目特别需要注意的陷阱。
你就出错在最后的分析上,将a赋值给c,却没有将a自减。
作者: ehehe    时间: 2015-8-25 19:36
kingkeykang 发表于 2015-8-25 00:58
你逗了吧!c=a_--运算之前a=4这样先把4赋给才c  ,a再自减 a=3,你分析这么好到后面一歩就搞不清了? ...

额,有时候会乱
作者: rhyhhg5    时间: 2015-8-25 19:59
a=b++ 这个你都懂了,c=a--这个不是同样道理吗?这种都是先输出后运算,而++a就是先进行加法运算,后进行输出
作者: xuxu5112    时间: 2015-8-25 20:18
最后的c = a-- ; 只把 a赋值给c 忘了自减了
作者: t_lins    时间: 2015-8-25 20:29
举个栗子:a=3;b=4;c=5;a=b++;b=++c;c=a--;分别输出a b c的结果是3 6 4
a=3;
b=4;
c=5;
a=b++   //执行这个代码的时候a=4 执行完这个代码的时候b=5
b=++c   //执行这个代码的时候 c=6 执行完的时候b=6
c=a--    //执行这个代码的时候c=4 执行完这个代码的时候a=3
所以最后a、b、c的值分别为3、6、4

不知道对你有没有帮助
作者: JXHIUUI    时间: 2015-8-25 20:30
网上摘抄了一段
一元运算符有:正(+)、负(-)、加1(++)和减1(--)4个。
加1、减1运算符只允许用于数值类型的变量,不允许用于表达式中。加1、减1运算符既可放在变量之前(如++i),也可放在变量之后(如i++),两者的差别是:如果放在变量之前(如++i),则变量值先加1或减1,然后进行其他相应的操作(主要是赋值操作);如果放在变量之后(如i++),则先进行其他相应的操作,然后再进行变量值加1或减1。
例如:
int i=6,j,k,m,n;
j = +i; //取原值,即j=6
k = -i; //取负值,即k=-6
m = i++; //先m=i,再i=i+1,即m=6,i=7
m = ++i; //先i=i+1,再m=i,即i=7,m=7
n = j--; //先n=j,再j=j-1,即n=6,j=5
n = --j; //先j=j-1,再n=j,即j=5,n=5
在书写时还要注意的是:一元运算符与其前后的操作数之间不允许有空格,否则编译时会出错。
作者: 刘登飞    时间: 2015-8-25 21:32
都解释的很全面,也对我们这些0基础的又重新加深了一下印象
作者: 徐雪涛xuxuetao    时间: 2015-8-25 21:40
最后那个c=a--中,你赋值之后,没有对a 减减。即c=a;(a=4赋值给c,此时c=4;);;;a--(a=4减减之后变为3;即a=3)
作者: ehehe    时间: 2015-8-25 22:37
徐雪涛xuxuetao 发表于 2015-8-25 21:40
最后那个c=a--中,你赋值之后,没有对a 减减。即c=a;(a=4赋值给c,此时c=4;);;;a--(a=4减减之后变为3; ...

谢谢,灰常感谢



作者: ehehe    时间: 2015-8-25 22:39
JXHIUUI 发表于 2015-8-25 20:30
网上摘抄了一段
一元运算符有:正(+)、负(-)、加1(++)和减1(--)4个。
加1、减1运算符只允许用于 ...

灰常感谢,说的很详细


作者: taojunqiu225    时间: 2015-8-25 22:49
学到了,大家一起学习!
作者: 徐雪涛xuxuetao    时间: 2015-8-26 13:01
ehehe 发表于 2015-8-25 22:37
谢谢,灰常感谢

能不能给个评分呀?
作者: javazhang    时间: 2015-8-26 14:16
你逗了吧!c=a_--运算之前a=4这样先把4赋给才c  ,a再自减 a=3,你分析这么好到后面一歩就搞不清了?
作者: a80C51    时间: 2015-8-26 14:41
本帖最后由 a80C51 于 2015-8-26 14:49 编辑

正如llwhcm所说,最后的这个a--并没有计算。对于这类运算,没有必要过于纠结。把握两点原则就好:
1,这种表达式存在两个运算——自增与赋值,一定要经过两步,才能结束这行代码。
2,运算顺序不一样
解释如下:
自增在前,例如a=++b,则是先进行自增运算,在把运算结果赋值给a,也就是说,最后a和b均会+1;
自增在后,例如a=b++,则是先进行赋值运算,然后b再自增,也就是说,最后a=b,而b+1;



作者: ehehe    时间: 2015-8-26 22:42
徐雪涛xuxuetao 发表于 2015-8-26 13:01
能不能给个评分呀?

狠心拒绝




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