java中++是什么运算符,java中==是什么符号

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: