Topic: 一个简单(i=i++; 的字节码指令)

  Print this page

1.一个简单(i=i++; 的字节码指令) Copy to clipboard
Posted by: microjuz
Posted on: 2006-01-22 00:28

int i=0;
i=i++;
System.out.println(i); //为什么打出来的是0呢?

查看字节码指令如下:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return

请结合上面的指令执行解我的迷惑,谢谢!!

2.Re:一个简单(字节码指令) [Re: microjuz] Copy to clipboard
Posted by: why
Posted on: 2006-01-22 04:37

Why would anyone write a line like this:
i = i++;
?

Why do you want to solve this puzzle by viewing the bytecode?

3.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: microjuz
Posted on: 2006-01-22 11:20

i=i++;的写法确实不对
这是我昨天在一个文档中看到的题目,觉得应该和vm有关系,所以查看字节码,但是还不太熟,如果有高手能解释一下就好了:)

4.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: why
Posted on: 2006-01-22 11:36

0: iconst_0 //pushes int 0 onto the stack (stack has 0 now)
1: istore_1 //pops int to local variable position one (i.e. i=0)
2: iload_1 //pushes int from local variable position one (stack has 0)
3: iinc 1, 1 //increments local variable position one (i.e. i=i+1=1)
6: istore_1 //pops int to local variable position one (i.e. i=0)

5.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: microjuz
Posted on: 2006-01-22 12:21

为什么
6: istore_1 //pops int to local variable position one (i.e. i=0)
取出来的是0不是1呢,上面一步inc不是把i变成1了吗???

就这个地方,指令的意思我查资料都明白了~~

6.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: why
Posted on: 2006-01-22 12:59

microjuz wrote:
为什么
6: istore_1 //pops int to local variable position one (i.e. i=0)
取出来的是0不是1呢,上面一步inc不是把i变成1了吗???

就这个地方,指令的意思我查资料都明白了~~

不知閣下明白甚麼呢?
pops int (from stack) to local variable position one

注意
2: iload_1 //pushes 0 onto the stack

7.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: jigsaw
Posted on: 2006-01-22 14:49

有意思。。。local var i is set to 1 at line 3, while line 6 set i back to 0, since line 6 simply pops 0 from stack...am i right?

8.Re:一个简单(i=i++; 的字节码指令) [Re: jigsaw] Copy to clipboard
Posted by: why
Posted on: 2006-01-22 21:20

jigsaw wrote:
有意思。。。local var i is set to 1 at line 3, while line 6 set i back to 0, since line 6 simply pops 0 from stack...am i right?

I think so. IOW, i++ has no effect in this statement.

9.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: microjuz
Posted on: 2006-01-23 23:51

o

请不要用那么阁下那么酸酸的字眼撒~~

10.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: why
Posted on: 2006-01-24 00:45

microjuz wrote:
请不要用那么阁下那么酸酸的字眼撒~~

那先請不要說"指令的意思我查资料都明白"這種話
敝人倒真的想知道閣下明白甚麼,不明白甚麼

子曰:知之為知之,不知為不知,是知也

11.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: ym21682
Posted on: 2006-02-07 15:51

i = i++;运行过程如下
1. 先将i=0赋给i
2. 将i自加,此时虽然i本身存值为1,但表现出来的仍然是0
注:可与++i相比较

12.Re:一个简单(i=i++; 的字节码指令) [Re: ym21682] Copy to clipboard
Posted by: javadd
Posted on: 2006-02-07 17:01

ym21682 wrote:
i = i++;运行过程如下
1. 先将i=0赋给i
2. 将i自加,此时虽然i本身存值为1,但表现出来的仍然是0
注:可与++i相比较


我想也是这样.

13.Re:一个简单(i=i++; 的字节码指令) [Re: why] Copy to clipboard
Posted by: microjuz
Posted on: 2006-02-15 23:22

why wrote:
那先請不要說"指令的意思我查资料都明白"這種話
敝人倒真的想知道閣下明白甚麼,不明白甚麼

子曰:知之為知之,不知為不知,是知也


呵呵-_-!!!看来我还真要学下怎么提问题了,其实我在说这句话的时候本意是让各位天才知道我查过inside the vm中这几条指令的解释
whywhy兄教训的是
SuN034SuN034

14.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: javaguan2
Posted on: 2006-02-23 14:22

我想学JAVA不应该钻研这个问题,i++和++i的问题入门的人都知道。
如果你是想研究虚拟机的话(看楼主提出的问题,对虚拟机的了解应该很皮毛),我觉得这里没有多少人会有时间钻研了

15.Re:一个简单(i=i++; 的字节码指令) [Re: microjuz] Copy to clipboard
Posted by: why
Posted on: 2006-02-24 03:15

microjuz wrote:
呵呵-_-!!!看来我还真要学下怎么提问题了,其实我在说这句话的时候本意是让各位天才知道我查过inside the vm中这几条指令的解释

重要的是閣下明白甚麼,不明白甚麼
查過又怎樣?查過不等如研讀過,研讀過不一定明白了



javaguan2 wrote:
我想学JAVA不应该钻研这个问题,i++和++i的问题入门的人都知道。

同意


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923