A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闯天涯 初级黑马   /  2014-4-18 21:39  /  1184 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


public class Test3 {
    public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i < 100; i++)
              j = j++;
        System.out.println(j);
    }
}

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 希望下次对问题在详细的描述下.

查看全部评分

4 个回复

倒序浏览
1、java运算符的优先级++符是大于=的。
2、The result of the postfix increment expression is not a variable, but a value.后++符表达式的结果是个值而不是一个变量。
也就是说后++符先将自己的值存储起来,然后对变量进行++;
再进行赋值操作,也就是将先存储起来的值赋给变量i,这样的操作就导致了i值被置为0了

对于C和C++来说不一样,在讲到m=i++操作时,C语言是先将i的值赋给了m,然后将i值++,这样i=i++的结果自然就是1了,c的实现中是不存在那个中间的值的存储的。

由于java和c不同的语言特性,导致了i=i++的不同之处,前面的笔记中已经提到,由于java lang spec中的一些细微规定,导致其运行结果的不同,我们可以用个例子来看i=i++在jvm中实际的运行过程。
源程序test.java:
public class test {
  public test() {
  }
  public static void main(String[] args) {
    int i=0;
    i=i++;
  }
}
我们用javap来看其实际的虚拟机指令集:
C:\JBuilderX\jdk1.4\bin>javap -c  -classpath "d:/" test
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   nop
   5:   return
public static void main(java.lang.String[]);
  Code:
   0:   iconst_0 //常数0入栈
   1:   istore_1 //i赋值,常数值出栈
//至此完成i=0;
   2:   iload_1  //装载变量i,0入栈
//第2步是特殊的一步,这步将i值先行保存,以备赋值使用
   3:   iinc    1, 1 //变量值增加,栈内值不变
//至此完成i++
   6:   istore_1 //i赋值,0出栈。
//至此完成i=i++
   7:   nop  //donothing
   8:   return
}
对比而言,对于i++而言,i=i++指令多了两步,2和6
其实这两步是赋值符号引起的,有意思的是第二步出现的时机,是在iinc之前,这就是因为java lang spec中规定的。








评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 很给力!

查看全部评分

回复 使用道具 举报
java中j++属于后加,是先执行将0辅助给j 然后再执行+1语句,而+1语句是在跳出循环后才会执行,所以在循环里面一直都是把0赋值给j 所以最后打印出结果肯定为0

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报 0 1
  1. i=0;
  2. j=i++;
  3. System.out.println(j);
复制代码

这个与java虚拟机对i=i++的处理有关。为简单起见,不妨先分析以上源代
由于i和j为局部变量,故存储在栈内存中,java虚拟机对上述过程的处理过程如下:
1.把常量0存储在栈顶
2.把栈顶的值(为常量0)赋给变量i,此时栈顶的值仍然为0,i的值为0,相当于执行i=0;
3.把i的值取出放到栈顶。此时栈顶的值为i的值,为0
4.把i的值自增1,此时i的值为1,栈顶仍然为0
5.把栈顶的值取出赋给变量j,此时j值为0,i值为1
以上过程后,j的值为0,i为1。无疑是正确的
可当把j=i++变为i=i++,则在步骤5中则变为把栈顶的值(0)赋给变量i,此时i又变为0。故无论循环多少次i的值最后都为0
回复 使用道具 举报
j++是属于后加,意为先参与运算再自增1,第一次循环j=j++,j++为0赋值给了j,这时j的值变为了0,而j++的值是1,然后在循环赋值的话,j的值还是一直为0,无论循环多少次,对其结果是不影响的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马