来一个老得掉牙的问题

grasszring 2010-06-03 03:15:41

public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++) {
// 这里是第赋值再执行运算,但是运算为什么没有执行?
j = j++;
}
System.out.println(j);
// --------------------
int x = 0;
for (int i = 0; i < 100; i++) {
// 这里是把上面的j=j++;改成了一下,按理论来说这两个应该是相同的结果吧。
// 先赋值再执行运算
x = x;
x++;
}
System.out.println(x);
// --------------------
int z = 0;
int y = 0;
for (int i = 0; i < 100; i++) {
// 这里把第一个改了一下,接收值的变量并非是自己改变了一下
y = z++;
}
System.out.println("z:" + z + ",y:" + y);
}


j=j++;全等于 j=j;j++;吗?
全等,为什么?
不全等,为什么?
请仔细看上面的例子。
...全文
199 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Java技术栈 2010-06-03
  • 打赏
  • 举报
回复

帮顶了
luiganqian 2010-06-03
  • 打赏
  • 举报
回复
路过~~~~~~~~~~~~~
YangWenChaoX 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhuxibang 的回复:]

在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为j = j++;是先将i的值(0)存入堆栈,然后对变量区中的j自加1,这时j的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的j,所以最后j = 0。 也就是……
[/Quote]
看了两遍了, 没明白。。。
Ark032425 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhuxibang 的回复:]
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为j = j++;是先将i的值(0)存入堆栈,然后对变量区中的j自加1,这时j的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的j,所以最后j = 0。 也就是说……
[/Quote]
顶,深入分析后++与前++
Ark032425 2010-06-03
  • 打赏
  • 举报
回复

public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++) {
// 这里是第赋值再执行运算,但是运算为什么没有执行?
j = j++;
//这里是后++,j++ = 0;所以j永远等于0。因为后++先赋值再++
}
System.out.println(j);
// --------------------
int x = 0;
for (int i = 0; i < 100; i++) {
// 这里是把上面的j=j++;改成了一下,按理论来说这两个应该是相同的结果吧。
// 先赋值再执行运算
x = x;
x++;
//这个跟上面的不同在于,x=x;赋值本身后,做了++运算,。而上面j每次都归0
}
System.out.println(x);
// --------------------
int z = 0;
int y = 0;
for (int i = 0; i < 100; i++) {
// 这里把第一个改了一下,接收值的变量并非是自己改变了一下
y = z++;
}
System.out.println("z:" + z + ",y:" + y);
}

zhuxibang 2010-06-03
  • 打赏
  • 举报
回复
i++的情况
iconst_0
istore_1
iload_1
iinc 1,1
istore_1

++i的情况
iconst_0
istore_1
iinc 1,1
iload_1
istore_1
zhuxibang 2010-06-03
  • 打赏
  • 举报
回复
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为j = j++;是先将i的值(0)存入堆栈,然后对变量区中的j自加1,这时j的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的j,所以最后j = 0。 也就是说你执行100次j=j++,最后j也是0,但是你要是j=++j执行100次最后j=100,原理因为j = ++j;是先对变量区中的j自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的j,所以j = ++j;的结果是j = 1。
x = x;//这句话是没用任何用处的,程序没有做任何执行任务,是一句垃圾代码
x++;//x做了一次自加操作

teddy000 2010-06-03
  • 打赏
  • 举报
回复
bangding~

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧