java中++是什么运算符,java中==是什么符号
正确答案是0。为什么?
为了理解这个问题,看一下这段代码生成的字节码:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4:转到15
7: iload_1
8: iinc 1,1
11: istore_1
12: iinc 2,1
15: iload_2
16:双推100
18: if_icmplt 7
21:get static # 16;//Field Java/lang/system . out:Ljava/io/PrintStream;
24: iload_1
25:invokevirtual # 22;//方法Java/io/printstream . println:(I)V
28:返回
j=j的字节码是:
7: iload_1
8: iinc 1,1
11: istore_1
ILO _ 1表示取出局部变量表中位置1的变量,放入操作数栈;
Iinc 1,1这是执行J运算,在局部变量表中位置1的变量加1;
Istore_1这是将操作数堆栈顶部的值弹出到局部变量表位置1的变量中。
问题出在NCC的指令上。指令的格式是:
innc温德克斯常数
这条指令只能操作int类型的变量。有两个操作数。第一个操作数vindex表示局部变量在局部表中的位置索引,第二个操作数const表示要相加的整数常量。诸如
innc 2 100
向表示局部变量表中位置2的变量添加100。
具体过程是取出局部变量表中位置2的变量,加100,然后放回局部变量表中。
const的常数值范围从-128到127。如果超出该范围,则使用指令iinc_w。比如:
int x=1;
x=x-128;
x=x-129;
x=x 127
x=x 128
生成的字节码如下:
0: iconst_1
1: istore_1
2: iinc 1,-128//x=x-128;
5: iinc_w 1,-129//x=x-129;
11: iinc 1,127//x=x 127;
14: iinc_w 1,128//x=x 128;
20:返回
innc指令的基本含义上面已经说清楚了,现在是最重要的一点:
innc指令操作的是局部变量表中的变量,而不是当前操作数栈顶的数据(iinc指令实现是否使用操作数栈无关紧要)。
上部j=j字节代码
7: iload_1
8: iinc 1,1
11: istore_1
ILO _ 1首先取出J的值,放在栈顶。此时,该值为0。执行命令iinc 1,1时,是操作的局部变量表中的一个变量(值为0),加1。此时,当前操作数堆栈顶部的值(或0)被放回局部变量表位置1的变量中,局部变量表位置1的变量的值从1变为1。
所以,不管怎么循环,j的值永远是0。
先说我和我:
大家都知道I是先用I的值,然后在I的值上加1;而I是先在I的值上加1,再用I的值。
但是实际上是怎么回事呢?其实我和我都用iinc vindex,1指令。不同的是,我先取出局部变量放在操作数栈顶,然后在局部变量表中的变量值加1,而我先在局部变量表中的变量值加1然后取出局部变量放在操作数栈顶。代码如下:
int j=0;
int x=j;
x=j;
字节代码如下:
2: iload_1 //先取出j的值0
3: iinc 1,1 //j,局部变量表中J的值加1,j=1。此时,操作数堆栈顶部的值仍为0。
6: istore_2 //将操作数堆栈顶部的值0添加到局部变量表中,其中x=0
7: iinc 1,1 //j,先把局部变量表中J的值加1,然后j=2。
10: iload_1 //取出j的值2。
11: istore_2 //x=2
2:return//方法返回
以上都是运算符,-的运算也一样,就不多说了。
现在我终于算出了这道简单的算术题——彻底——:)
最后感谢基友们和我一起默默研究这个问题。他的博客地址是:
http://zhaohe162.blog.163.com/
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。