黑马程序员技术交流社区

标题: 深夜来一发 [打印本页]

作者: anTG    时间: 2016-11-24 01:19
标题: 深夜来一发
main里,
a = a++;
System.out.println(a);
结果等于多少?
why?

作者: anTG    时间: 2016-11-24 01:25
忘了说了,上面还有一个int a = 5;

作者: 晓勃    时间: 2016-11-24 01:46
输出结果为6啊,a=5,a++自曾1,然后在赋值给a本身 最后输出打印结果是6 不要按照数学的思路去想就好了。等号右边的数是赋给左面的,而不是左右相等。

作者: yellowredroc    时间: 2016-11-24 02:00
晓勃 发表于 2016-11-24 01:46
输出结果为6啊,a=5,a++自曾1,然后在赋值给a本身 最后输出打印结果是6 不要按照数学的思路去想就好了。等 ...

其实是先赋值再自增1

作者: FAN8210    时间: 2016-11-24 07:00
先赋值,再自增,输出a,为6.另,打印a++,它也是6

作者: 杨森的安卓路    时间: 2016-11-24 09:12
这个结果是5

作者: 杨森的安卓路    时间: 2016-11-24 09:13
System.out.println(a);
作者: 杨森的安卓路    时间: 2016-11-24 09:15
int a = 5;                 int b = 5;                 a=a++;                 b=a;
作者: 杨森的安卓路    时间: 2016-11-24 09:17
int a = 5;                 int b = 5;                 a=a++;                 b=a;                                 System.out.println(a);                 System.out.println(b);这个a输出为5,b也为5;
作者: 乡村看水    时间: 2016-11-24 09:57
这个结果为五

作者: 乡村看水    时间: 2016-11-24 09:58
a=++a 结果为五  a=a++ 结果为六

作者: anTG    时间: 2016-11-24 10:04
FAN8210 发表于 2016-11-24 07:00
先赋值,再自增,输出a,为6.另,打印a++,它也是6

真相是要通过实践来检测的

作者: anTG    时间: 2016-11-24 10:06
乡村看水 发表于 2016-11-24 09:58
a=++a 结果为五  a=a++ 结果为六

你这说反了吧

作者: anTG    时间: 2016-11-24 10:08
杨森的安卓路 发表于 2016-11-24 09:17
int a = 5;                 int b = 5;                 a=a++;                 b=a;                                 System.out.println(a);                 System.out.println(b);这个a输出 ...

why?  不是很理解这个结果               

作者: anTG    时间: 2016-11-24 10:11
yellowredroc 发表于 2016-11-24 02:00
其实是先赋值再自增1

但是它不是6

作者: 乡村看水    时间: 2016-11-24 10:18
anTG 发表于 2016-11-24 10:06
你这说反了吧

嗯是说反了好尴尬

作者: 乡村看水    时间: 2016-11-24 10:28
anTG 发表于 2016-11-24 10:06
你这说反了吧

a++是先给左面赋值再自增 ++a是先自增再赋值 这下对了

作者: duanqichao    时间: 2016-11-24 10:38
结果是6。a=a++的时候的a确实是5,但是你输出a时候a已经自增1过了,所以是6。

作者: anTG    时间: 2016-11-24 12:07
duanqichao 发表于 2016-11-24 10:38
结果是6。a=a++的时候的a确实是5,但是你输出a时候a已经自增1过了,所以是6。
...

所以就有问题了,结果是5

作者: anTG    时间: 2016-11-24 12:08
乡村看水 发表于 2016-11-24 10:28
a++是先给左面赋值再自增 ++a是先自增再赋值 这下对了

照这样子,结果就不是5了啊

作者: 杨森的安卓路    时间: 2016-11-24 13:27
anTG 发表于 2016-11-24 10:08
why?  不是很理解这个结果

第一步,在内存里边,a先把5放到一边,再在运算空间里+1变为6。
第二步,a把放到一边的5又赋值给了它自己,a这时候就从6变为了5。
所以,输出的a是5。

作者: FAN8210    时间: 2016-11-24 13:32
嗯,这是用手机打的,一拿到电脑就实验了,是5。也实验了别的几种情况。

作者: 杨森的安卓路    时间: 2016-11-24 13:33
anTG 发表于 2016-11-24 10:08
why?  不是很理解这个结果

如咱们之前所说的b=a++,其实不是a先赋值给b再进行自增,而是a先把这个要赋给b的值放到一边,自己先进行+1,然后再把放到一边的这个值给b

作者: anTG    时间: 2016-11-24 13:58
杨森的安卓路 发表于 2016-11-24 13:27
第一步,在内存里边,a先把5放到一边,再在运算空间里+1变为6。
第二步,a把放到一边的5又赋值给了它自己 ...

大概明白了,(*๓´╰╯`๓)Ťhαnk ㄚou..

作者: anTG    时间: 2016-11-24 13:59
FAN8210 发表于 2016-11-24 13:32
嗯,这是用手机打的,一拿到电脑就实验了,是5。也实验了别的几种情况。
...

实践出真理

作者: 乡村看水    时间: 2016-11-24 14:16
anTG 发表于 2016-11-24 12:08
照这样子,结果就不是5了啊

验证一下就知道了

作者: 乡村看水    时间: 2016-11-24 14:54
走向程序的第一步环境变量已经通过  第二部又卡倒了

作者: duanqichao    时间: 2016-11-24 21:21
anTG 发表于 2016-11-24 12:07
所以就有问题了,结果是5

嗯嗯,确实是5,这样只能说明那个++就没有去执行,只是把a的值去赋值了。 可以和if(a++> b )中的这种情况做个比较,这种的++是参与运算的。
作者: anTG    时间: 2016-11-24 21:35
duanqichao 发表于 2016-11-24 21:21
嗯嗯,确实是5,这样只能说明那个++就没有去执行,只是把a的值去赋值了。 可以和if(a++> b )中的这种情况 ...

等于5就没执行了,你别自己想着来啊,你怎么就知道++就没有执行呢?

作者: duanqichao    时间: 2016-11-24 21:57
anTG 发表于 2016-11-24 21:35
等于5就没执行了,你别自己想着来啊,你怎么就知道++就没有执行呢?

debug可以验证。

作者: anTG    时间: 2016-11-24 22:42
duanqichao 发表于 2016-11-24 21:57
debug可以验证。

debug一行一行走,a = a++在同一行,怎么能看出来++执行没执行?

作者: anTG    时间: 2016-11-25 00:43
乡村看水 发表于 2016-11-24 14:16
验证一下就知道了

不知道怎么验证的。。。

作者: SuperLan    时间: 2016-11-25 00:53
为什么结果是5???
作者: anTG    时间: 2016-11-25 07:53
SuperLan 发表于 2016-11-25 00:53
为什么结果是5???

分析一下内存肯定就知道了,可我不知道怎么分析

作者: aA772807986    时间: 2016-11-25 10:10
结果:a=5呢!!!
作者: aA772807986    时间: 2016-11-25 10:11
本帖最后由 aA772807986 于 2016-11-25 10:14 编辑
aA772807986 发表于 2016-11-25 10:10
结果:a=5呢!!!

因为a=a++相当于输出a++=5

作者: 呱码农    时间: 2016-11-25 11:39
package com.java1234.test;

public class Test1 {
public static void main(String[] args) {
        int a=5;
        a=a++;
        System.out.println(a);
}
}


5


实践是检验整理的唯一标准

作者: 呱码农    时间: 2016-11-25 11:41
其实是先赋值再自加的,自加自后的a留着下一次使用,但是那条赋值语句已经执行过了。就不再执行,直接执行打印输出语句。所以结果是5
作者: anTG    时间: 2016-11-25 11:42
答案不是重点,下一个问题why?,这才是重点

作者: anTG    时间: 2016-11-25 11:44
呱码农 发表于 2016-11-25 11:41
其实是先赋值再自加的,自加自后的a留着下一次使用,但是那条赋值语句已经执行过了。就不再执行,直接执行 ...

你在后边再加一句int b=a;打印试试

作者: 呱码农    时间: 2016-11-25 11:45
anTG 发表于 2016-11-25 11:44
你在后边再加一句int b=a;打印试试

我int a1=a;输出a1
结果还是5。
哈哈哈这个我也不懂了
求解释
作者: anTG    时间: 2016-11-25 11:48
呱码农 发表于 2016-11-25 11:45
我int a1=a;输出a1
结果还是5。
哈哈哈这个我也不懂了

不可描述,因为我也说不清楚

作者: 呱码农    时间: 2016-11-25 12:45
anTG 发表于 2016-11-25 11:48
不可描述,因为我也说不清楚

我知道了!
右边的a是先赋值给左边的a的,然后再自加,打印输出a是左边的a的值,左边的a一旦被赋值了就不能改变了。所以是5。
但其实a++后a的值应该是6的,为了证明这一点。
我把a=a++;用b=a++替换掉。再打印a,就会发现a的输出结果是6了。

作者: anTG    时间: 2016-11-25 13:42
呱码农 发表于 2016-11-25 12:45
我知道了!
右边的a是先赋值给左边的a的,然后再自加,打印输出a是左边的a的值,左边的a一旦被赋值了就不 ...

那你知不知道为什么左边的a被赋值就不能改变了?

作者: 呱码农    时间: 2016-11-25 15:11
anTG 发表于 2016-11-25 13:42
那你知不知道为什么左边的a被赋值就不能改变了?

你说说?
作者: anTG    时间: 2016-11-25 16:03
呱码农 发表于 2016-11-25 15:11
你说说?

我不知道!!!





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