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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Aron 中级黑马   /  2014-6-17 21:58  /  1362 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Aron 于 2014-6-17 23:05 编辑
  1. int a = 0;
  2.                 int b = 0;
  3.                 a=b++;
  4.                 System.out.println(a);
  5.                 System.out.println(b);
  6.                 System.out.println("----------");
  7.                 a=a++;
  8.                 System.out.println(a);
  9.                 System.out.println("----------");
  10.                 b=b++;
  11.                 System.out.println(a);
  12.                 System.out.println(b);
  13.                 System.out.println("----------");
  14.                 for(int i=0 ; i<5; i++){
  15.                         b=b++;
  16.                 }
  17.                 System.out.println(b);
复制代码

电脑运行结果为:
0
1
----------
0
----------
0
1
----------
1
我知道第一个a和b结果是0 1;因为b是先把值赋给a再自己加1;
但是第二个a=a++;按理说也是a先赋值 也就是a=0;然后a再自己加1;但是为什么还是0 有人说是因为a先被一个临时变量存储起来 然后a在自己加1 最后把临时变量值还给a 所以没有变 但是我想知道为什么会这样 a=a++;怎么就会变成有临时变量了。
还有就是b=b++;我后面写了一个循环 无论循环多少次结果都不变 其实和前面的疑问一样 为什么会这样额。。详细说明下 谢谢了~

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

9 个回复

倒序浏览
在前面就是先自增再附值。
在后面就是先附值再自增。
回复 使用道具 举报
a=a++是表示 a++表达式的值赋给 左边的a(右边的a和左边的不是同一个a)
回复 使用道具 举报
小周务商 发表于 2014-6-17 22:01
在前面就是先自增再附值。
在后面就是先附值再自增。

你这个回答的  ⊙﹏⊙b汗  说了等于没说啊
回复 使用道具 举报
endian11 发表于 2014-6-17 22:06
a=a++是表示 a++表达式的值赋给 左边的a(右边的a和左边的不是同一个a)

你的意思是 先对a++执行 然后把这个表达式的值赋给 a 这两个a不是同一个a 但是名字都一样怎么不一样额
还有a++这个表达式执行的值也应该是1 啊
回复 使用道具 举报
Aron 发表于 2014-6-17 22:13
你这个回答的  ⊙﹏⊙b汗  说了等于没说啊

就是这个样子,你多看几遍视频,两遍就够了!!!!
回复 使用道具 举报
应该这样说,=是先执行右边的,上一轮a输出0,a++这个表达式的值仍然是零(后加)然后再赋给a
回复 使用道具 举报
for 语句这个b=b++,b++(表达式的值为1)之后,又重新赋给b=1,后边又循环,无论执行多少次 b最后结果都为1
回复 使用道具 举报
Aron 中级黑马 2014-6-17 22:47:33
9#
我找到答案了 你们说的有些不全面 有些有问题 我把答案写下来给大家分享下吧 相信你们会有收获的
这个是java 和 c中的区别
学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试:
  JAVA:
  public class test
  {
  public static void main(String args[])
  {
  inti,j;
  i=0;
  for(j=0;j<5;j++)
  {
  i=i++;
  System.out.println("i="+i);
  }
  }
  }
  C:
  #include
  main()
  {
  inti,j;
  i=0;
  for(j=0;j<5;j++)
  {
  i=i++;
  printf("i=%d\n",i);
  }
  }
  你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。
  第一个JAVA程序得出的结果如下:
  i=0
  i=0
  i=0
  i=0
  i=0
  而第二个C程序得出的结果如下:
  i=1
  i=2
  i=3
  i=4
  i=5
  同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:
1 内存先分配一个空间保存i的原始值;
2 然后i自己加上1
3 然后再把刚才存放的那个i的原始值赋给j

  i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
  明白了上面的问题,让我们接下来看看i=i++的情况:
1 内存先分配一个空间保存i的原始值;
2 然后i自己加上1
3 然后再把刚才存放的那个i的原始值赋给i
  所以这样最后一次循环内的结果仍旧是i(即0)。
  而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。
回复 使用道具 举报
视频里就是这么讲的,多看两遍就好{:2_40:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马