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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ZHAOWEI 中级黑马   /  2014-5-3 01:11  /  3309 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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);
  }
}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

23 个回复

倒序浏览
看到头都晕了

点评

O(∩_∩)O~  发表于 2014-5-3 04:02
回复 使用道具 举报
本帖最后由 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); //这样更直观
这样书写代码,更方便编写代码,也便于代码的阅读和维护。










评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
NewDemo 发表于 2014-5-3 02:34
楼主你分析b的思路正确,可能是在分析a的时候犯迷糊了吧,看下我的分析

原来是这样的呀,我还以为,b赋值给a就直接3+3+3-2=7呢。
回复 使用道具 举报
本帖最后由 帅飞 于 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  

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









评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

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

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

呵呵,是啊,我也能猜到这种情况应该不常用,我提这个问题是为了让我更容易了解运算啊。
回复 使用道具 举报
帅飞 发表于 2014-5-3 05:08
a=0,b=3

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

哥们,你写的真好,写的这么详细,这么好,你妈妈知道么:lol
回复 使用道具 举报
看看 飘过
回复 使用道具 举报
你这个程序如果按照你写的代码的话,运行出来的A是不是=7?
首先b++和b--是在执行完这段语句后再进行自加或者自减,只有--b是先自减之后再自加,按照你那段语句的运行结果我算出来是得7.3+3+3-2
往指点.
回复 使用道具 举报
我也算出来了,这一看这么多人发帖。。。  我还是算了吧,不贴出来了。。
回复 使用道具 举报
网上搜下“贪心法”,c语言的词法分析你可以看看,本质的东西
回复 使用道具 举报
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就出来了。
说的不好勿怪
回复 使用道具 举报
好问题!!
回复 使用道具 举报
ZHAOWEI 发表于 2014-5-3 19:31
哥们,你写的真好,写的这么详细,这么好,你妈妈知道么

:L...................................
回复 使用道具 举报
不是 4+4+3-3=8?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马