黑马程序员技术交流社区

标题: 求a=b++ + b++ + b-- - --b的运算过程 [打印本页]

作者: ZHAOWEI    时间: 2014-5-3 01:11
标题: 求a=b++ + b++ + b-- - --b的运算过程
本帖最后由 ZHAOWEI 于 2014-5-10 17:54 编辑

public class BianLiang_LianXi
{
  public static void main(String[] args)
  {
    int a=0,b=3;

    a=b++ + b++ + b-- - --b;
    //我是这样想的,b的运算结果:(1)b=3+1 + (2)b=4+1 + (3)b=5-1 - (4)b=-1+4 ; 所以b=3,这个肯定没问题。
    //那a=9是怎么算的?如果是a=b++; 这样的运算过程还能理解。b++ + b++ + b-- - --b要怎么赋值给a?,内存中是怎么处理呢?
    System.out.println("a="+a+";b="+b);
  }
}

作者: 程序爱好者    时间: 2014-5-3 01:27
看到头都晕了
作者: NewDemo    时间: 2014-5-3 02:34
本帖最后由 NewDemo 于 2014-5-3 02:44 编辑

{:2_30:}楼主你分析b的思路正确,可能是在分析a的时候犯迷糊了吧,看下我的分析

  1. public class Test1 {
  2.         public static void main(String[] args) {
  3.                 int a = 0, b = 3;

  4.                 a = b++ + b++ + b-- - --b;
  5.                 // 我是这样想的,b的运算结果:(1)b=3+1 + (2)b=4+1 + (3)b=5-1 - (4)b=-1+4 ;
  6.                 //楼主上面分析的没错,我再给翻译一遍
  7.                 //第一个b++在运算的时候b=3参与运算,然后自增为b=4,到第二个b++的时候b=4参与运算,然后自增为b=5,
  8.             //到b--的时候b=5参与运算,然后自减为b=4,到--b的时候,b=4先自减为b=3然后参与运算
  9.             //所以a=3+4+5-3   -->a=9
  10.                 System.out.println("a=" + a + ";b=" + b);
  11.         }
  12. }
复制代码

援引一些经验
其实在实际的开发中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,示例代码:
int m = 12;
int n = m << 1 + 2;
int n = m << (1 + 2); //这样更直观
这样书写代码,更方便编写代码,也便于代码的阅读和维护。











作者: ZHAOWEI    时间: 2014-5-3 04:06
NewDemo 发表于 2014-5-3 02:34
楼主你分析b的思路正确,可能是在分析a的时候犯迷糊了吧,看下我的分析

原来是这样的呀,我还以为,b赋值给a就直接3+3+3-2=7呢。
作者: 帅飞    时间: 2014-5-3 05:08
本帖最后由 帅飞 于 2014-5-3 06:29 编辑

a=0,b=3

a=b++   —————————————————a=3,b=4

a=b++ + b++   ——————————————a=7,  b=5

a=b++ + b++ + b--    ———————————a=12, b=4

a=b++ + b++ + b-- - --b  —————————a=9,   b=3

a=b++ + b-- - --b  ————————————a=5,   b=2

a=b-- - --b  ———————————————a=2,    b=1


这些结果都是本人亲测,由此可见:

1、不论是b++,++b,还是b-- , --b,只要出现自运算,有一次算一次,在前一次的基础上做加减。

2、a=b(3)++ + b(4)++ =7    第一个b++在加法运算时其在内存中的值为3,第二个b++应为做一次自加运算其值为4。

      a=b(3)++ + b(4)++ + b(5)-- =12   x++和x--在加减运算中,后一次自运算作为加减数的值应为前一次自运算的值

      a=b(3)++ + b(4)++ + b(5)-- - --b(3) =9  --b中的b值应为前一次运算的结果4,但要先自运算再进行加减运算,值为3。

      a=b(3)++  +b(4)-- - --b(2) =5    --b中的b值为前一个b--自运算的结果3,做加减运算前应先进行自运算,值为2.

     a=b(3)-- - --b(1) =2  

     【括号里的值都是作为加减运算在内存中的值】










作者: zhangle    时间: 2014-5-3 08:38
过来围观问题,楼上的分析也让我解除了对++、--的一些迷惑,谢楼上
作者: 孟凡超    时间: 2014-5-3 08:56
头晕。。。。。
作者: 唯伟123    时间: 2014-5-3 12:57
楼主何必纠结这个,只要知道了a++,++a,b--,--b就不难得到结果,我看你就是被这一大串看晕了而已。实际开发中根本不会出现,因为敢写成这样的早就被boss一脚踹走了,也就是面试题中来弄你的。我说的好不好?版主同意,就给分吧!
作者: 邵景伦    时间: 2014-5-3 15:47
a = b++ + b++ + b-- - --b;
a=((1)b=3+1) + ((2)b=4+1 )+( (3)b=5-1) - ((4)b=-1+4) ;
自增过程中b是随自增改变的,在前面的运算结果中进行运算
作者: ZHAOWEI    时间: 2014-5-3 19:27
唯伟123 发表于 2014-5-3 12:57
楼主何必纠结这个,只要知道了a++,++a,b--,--b就不难得到结果,我看你就是被这一大串看晕了而已。实际开 ...

我问这个问题是是因为我是初学者啊,我之所以有疑惑是因为,我不知道b在运算的时候到底会储存几个值,会不会同时储存好几个,现在知道了。
作者: ZHAOWEI    时间: 2014-5-3 19:28
唯伟123 发表于 2014-5-3 12:57
楼主何必纠结这个,只要知道了a++,++a,b--,--b就不难得到结果,我看你就是被这一大串看晕了而已。实际开 ...

呵呵,是啊,我也能猜到这种情况应该不常用,我提这个问题是为了让我更容易了解运算啊。
作者: ZHAOWEI    时间: 2014-5-3 19:31
帅飞 发表于 2014-5-3 05:08
a=0,b=3

a=b++   —————————————————a=3,b=4

哥们,你写的真好,写的这么详细,这么好,你妈妈知道么:lol
作者: dkwoxihuan    时间: 2014-5-3 19:31
看看 飘过
作者: tc4892998    时间: 2014-5-3 20:12
你这个程序如果按照你写的代码的话,运行出来的A是不是=7?
首先b++和b--是在执行完这段语句后再进行自加或者自减,只有--b是先自减之后再自加,按照你那段语句的运行结果我算出来是得7.3+3+3-2
往指点.
作者: 张然龙    时间: 2014-5-3 20:12
我也算出来了,这一看这么多人发帖。。。  我还是算了吧,不贴出来了。。
作者: tripleCC    时间: 2014-5-3 21:40
网上搜下“贪心法”,c语言的词法分析你可以看看,本质的东西
作者: 郭文龙    时间: 2014-5-3 23:53
a明白就不多解释了,
赋值 :是指 把等号右边的 赋值给左边的 不是a=b++;这种挨着就赋值。
内存中 先做 int a=0,b=3;然后处理等号右面部分
因为b=3 所以b++就是3 然后自增一次 此时b=4 接着 加上 b++
因为刚才自增后b=4了 所以第二个b++等于4 ,b又自增一次 此时b=5。
因为b=5接着b--就等5 此时b自减一次 b等于4
--b是先自减一次 再参与运算 此时b等于4-1 然后--b就等于3了
把这4项 进行运算3+4+5-3=9 赋给a 。a=9就出来了。
说的不好勿怪
作者: Sunday    时间: 2014-5-4 00:26
好问题!!
作者: 帅飞    时间: 2014-5-4 01:04
ZHAOWEI 发表于 2014-5-3 19:31
哥们,你写的真好,写的这么详细,这么好,你妈妈知道么

:L...................................
作者: ς高眼光の目标    时间: 2014-5-4 01:38
不是 4+4+3-3=8?
作者: ZHAOWEI    时间: 2014-5-4 04:55
tc4892998 发表于 2014-5-3 20:12
你这个程序如果按照你写的代码的话,运行出来的A是不是=7?
首先b++和b--是在执行完这段语句后再进行自加或者 ...

结果是9,
作者: ZHAOWEI    时间: 2014-5-4 06:43
tc4892998 发表于 2014-5-3 20:12
你这个程序如果按照你写的代码的话,运行出来的A是不是=7?
首先b++和b--是在执行完这段语句后再进行自加或者 ...

开始我也以为是7,但真不是7,想到是7,是通过a=b++推理出来的。但a=b++ + b++,我现在以为正确的推导是这样的 a=b+b,但是如果a= b++ +  b++,那b的值在赋给a之前会自增一次。
作者: tc4892998    时间: 2014-5-4 12:08
ZHAOWEI 发表于 2014-5-4 06:43
开始我也以为是7,但真不是7,想到是7,是通过a=b++推理出来的。但a=b++ + b++,我现在以为正确的推导是 ...

噢,受教了!




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