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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 箫庐 黑马帝   /  2011-12-2 18:01  /  4106 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 箫庐 于 2011-12-5 08:41 编辑

请教:为什么以下程序
               int a = 3,b = 0;
                a=a++;
                System.out.println(a+1);        
                System.out.println(a);
运行结果是:
4
3
;而   
               int a = 3,b = 0;
                b=a++;
                System.out.println(a+1);        
                System.out.println(a);

运行结果是:
5
4

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

22 个回复

倒序浏览
许邦存 来自手机 黑马帝 2011-12-2 18:24:55
沙发
第一个程序a=a++实际上是把当前的a值赋予a,那么a的值还是3,输出就应该是4和3,下面的程序不难理解,自加后为4.那么输出就是5和4了,两程序只要写a++,而没有赋值,输出同样都会是5和4。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
b=a++是只先把a的值赋值给b。然后再加1赋值给a。b=a++就相当于b=a;a=a+1
回复 使用道具 举报
而a=a++就相当于把a当前的值赋给a,因为是先赋值运算的,然后才会做++的运算
回复 使用道具 举报
a++先赋值再运算这个我知道.
可是
a=a++明显没有做运算啊?我想问的是这个……
回复 使用道具 举报
此时的a已经不在是执行a++的那个a了吧,它的值为3,执行a++的是后面那个a的事。应该是这样吧,呵呵,估计得用内存方面的知识来认识。
回复 使用道具 举报
应国炎 黑马帝 2011-12-3 14:10:17
7#
因为第一个a=a++是先用再加,先用3加1,原值再赋值给了a,所以a的值还是3。第二个a,加完以后就是4了,没有重新赋给a,所以为4(b为3)
回复 使用道具 举报
武超 黑马帝 2011-12-3 15:10:09
8#
实际上在执行a=a++时是将a=3这个值赋给了a,然后再执行的a++这个命令,但是在打印时打印出的是被赋值之后的的a+1和a的值,这样打印才是4和3,;
而第二个是将a=3赋值给b之后再a++,打印出来的结果当然是自增之后的a+1和a了。
回复 使用道具 举报
赵燕燕 黑马帝 2011-12-3 23:16:54
9#
我也很疑惑这个问题。java中的变量必须先定义后使用,
  int a = 3,b = 0;
                a=a++;
这里a只定义了一次,说明这三个a是同一个,
a=a++;
先将a的值赋值给左边的a,左边的a成为了3,之后,右边的a自加1成为了4。可是a是同一个,所以左a右a的值,都应该是4才对啊,为什么会打印出4.3呢?
回复 使用道具 举报
段波 黑马帝 2011-12-4 09:00:37
10#
这是一个算符优先级的问题!a=a++;内部计算是:temp=a;a+=1;a=temp; 也就是说a=4的值被a=3的值覆盖了,所以最后a的值等于3。b=a++; 当然就是temp=a;a+=1;b=temp; 也就是说在运算过程中用到了一个临时temp空间。不知道这样的解释是否得当!
回复 使用道具 举报
方书堂 发表于 2011-12-2 19:15
b=a++是只先把a的值赋值给b。然后再加1赋值给a。b=a++就相当于b=a;a=a+1

照你这么说的话,那a=a++就相当于a=a;a=a+1;那最后输出的a应该为4呀,为什么是3呢?
回复 使用道具 举报
方书堂 发表于 2011-12-2 19:20
而a=a++就相当于把a当前的值赋给a,因为是先赋值运算的,然后才会做++的运算 ...

照你这么说,是把a当前的值3取出来再赋给a,然后做++运算,但是这个++的运算结果保存到哪个变量去了呢(或者说这个运算结果赋值给谁了呢)?如果没有保存到变量的话,那这个运算就是没用的运算,我不明白的也就是这个地方了
回复 使用道具 举报
应国炎 发表于 2011-12-3 14:10
因为第一个a=a++是先用再加,先用3加1,原值再赋值给了a,所以a的值还是3。第二个a,加完以后就是4了,没有 ...

您和上楼说的有两个a,但是定义的就只有一个a呀,不管a出现了多少次,a总是指向相同的一个内存地址吧?那么最后a的值就是最后一次赋值后的值。在这里我想问的是:a=a++这条表达式的赋值和运算优先级,这里有没有做++的运算,如果做了为什么运算结果不赋值给a呢?
回复 使用道具 举报
本帖最后由 戴振良 于 2011-12-4 20:34 编辑
段波 发表于 2011-12-4 09:00
这是一个算符优先级的问题!a=a++;内部计算是:temp=a;a+=1;a=temp; 也就是说a=4的值被a=3的值覆盖了,所以 ...


这位大哥,请问这是你自已猜的还是在哪本书学的?对比以上的回答就你的似乎最有道理了!分析分解的也最详细!!
回复 使用道具 举报
段波 黑马帝 2011-12-4 20:53:43
15#
戴振良 发表于 2011-12-4 20:32
这位大哥,请问这是你自已猜的还是在哪本书学的?对比以上的回答就你的似乎最有道理了!分析分解的也最详 ...

倒推的!
回复 使用道具 举报
箫庐 发表于 2011-12-3 12:45
a++先赋值再运算这个我知道.
可是
a=a++明显没有做运算啊?我想问的是这个…… ...

做运算了吧,a=a++这条命令一开始先执行了"a=a",可以理解为覆盖,后又给a加了一个1,所以在接下来的运算中,  System.out.println(a+1); 中的a是覆盖后的,所以结果是4,然后继续执行 System.out.println(a); 用的仍然是覆盖后的a,希望对你有帮助。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
刚刚看了张孝祥老师的JAVA基础视频教程,其中说到这个类似问题,他说我们应该把表达式分开写,这样容易看懂,如果把表达式写一行,又复杂,运算速度也不会加快,而且还容易出错,比如:int a=2;int b=(a++)+3*a;执行完这两条语句按我我们的逻辑算的话应该b是9或者12,可是答案b是等于11,奇怪吧,又有谁能解释这个呢?
回复 使用道具 举报
本帖最后由 戴振良 于 2011-12-4 22:03 编辑
杨银川 发表于 2011-12-4 21:14
做运算了吧,a=a++这条命令一开始先执行了"a=a",可以理解为覆盖,后又给a加了一个1,所以在接下来的运算中 ...


还是不明白。根椐你的”a=a“,那此时a=3,是吧?“后又给a加了一个1,那a=4了已经,是吧?可是a的值最后只能有一个,怎么会有覆盖不覆盖的a呢?照你的说法的话是有一个覆盖前的a和一个覆盖后的a,那我要你用连续两条输出语句输出一个覆盖前的a,和一个覆盖后的a,可以办到么?
回复 使用道具 举报
戴振良 发表于 2011-12-4 22:01
还是不明白。根椐你的”a=a“,那此时a=3,是吧?“后又给a加了一个1,那a=4了已经,是吧?可是a的值最后只 ...

这个我现在还想不出,不过我纠正一下,不是真的覆盖啊,我想的是那样更好理解,也许不能那么理解吧,其实,这就是一个先用再加的问题,本来想能帮到你,又让你理解错了,呵呵,不好意思
回复 使用道具 举报
箫庐 黑马帝 2011-12-5 08:40:54
20#
段波 发表于 2011-12-4 09:00
这是一个算符优先级的问题!a=a++;内部计算是:temp=a;a+=1;a=temp; 也就是说a=4的值被a=3的值覆盖了,所以 ...

如果是引用了临时变量,那么就理解了.不知道这个解释有没有根据?不过还是你说的比较容易理解,谢谢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马