黑马程序员技术交流社区

标题: 基础知识. [打印本页]

作者: Style栉    时间: 2014-3-26 16:26
标题: 基础知识.
本帖最后由 Style栉 于 2014-3-26 18:53 编辑

int i=3;
i=i++;
System.out.print(i);
//为啥会是3啊....虽然是先给左边的i赋值.可是不还是做++操作么

作者: 菜小徐    时间: 2014-3-26 16:29
i=i++相当于    i=i ; i++;  
它是先把i值赋给i,然后再进行相加
作者: H-Deka    时间: 2014-3-26 16:36
i++这个是先运算在执行++动作,所以是先将i的值赋给i,i的值就是3,然后又执行的++动作
作者: 学习代码    时间: 2014-3-26 16:38
这个中包含了两个知识点,一是赋值,2是自增的问题
想一下你现在定义的是 int i =3 ;在执行 i = i++;的时候,先做的是赋值的动作,后做的事自增,

在输出语句执行到的时候,就把 3 给输出来了
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i = 3,b;
  6.                         b=i;
  7.                         i++;
  8.                
  9.                 System.out.println(b+";"+i);
  10.         }
  11. }
复制代码

这样就能看到 i 自增后的值了

作者: 李东梁    时间: 2014-3-26 17:10
  1. int i=3;
  2. i=i++;
  3. System.out.print(i);
复制代码


你理解错了,这样理解
首先,i=3;
然后,把i赋值给i,i此时是3,i打印后才加1
  1. int i = 3;
  2.                 System.out.println(i++);
  3.                 System.out.println(i);
复制代码

这样能理解吗?
作者: MVP    时间: 2014-3-26 17:33
i++,是先赋值后运算的。相当于把i的值赋给i,i再自增加1。如果是++1,打印出来就是4,因为是先自增后运算。其实,这个知识点很好记,你只要看他的++符号在哪边,如果是在左边就是先自增后运算,如果是右边则是先运算后自增。
作者: 年轻的老头    时间: 2014-3-26 17:59
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。 语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。 因为i = i++;是先将i的值(3)存入堆栈,然后对变量区中的i自加1,这时i的值的确是4,但是随后的istore_1又将堆栈的值(3)弹出赋给变量区的i,所以最后i = 3。
作者: 年轻的老头    时间: 2014-3-26 18:07
    Code:        0: iconst_3              1: istore_1              2: iload_1               3: iinc          1, 1        6: istore_1     
作者: 年轻的老头    时间: 2014-3-26 18:08
javap -c Demo.class
作者: Style栉    时间: 2014-3-26 18:42
菜小徐 发表于 2014-3-26 16:29
i=i++相当于    i=i ; i++;  
它是先把i值赋给i,然后再进行相加

那最后不是也进行++操作了么  虽然是先赋值
作者: Style栉    时间: 2014-3-26 18:43
年轻的老头 发表于 2014-3-26 17:59
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。 语句istore_1是 ...

明白....原来是这样..
作者: 菜小徐    时间: 2014-3-26 19:39
Style栉 发表于 2014-3-26 18:42
那最后不是也进行++操作了么  虽然是先赋值

i(1)=i(2)++;我先把两个i编号,当作两个数来看,程序要输出的是i(1),而i(1)已经被赋值为i(2),所以不管i(2)++还是--都已经与i(1)无关了,程序直接输出i(1)就行了。当然i(2)的值的确发现修改了。
作者: Style栉    时间: 2014-3-26 19:49
菜小徐 发表于 2014-3-26 19:39
i(1)=i(2)++;我先把两个i编号,当作两个数来看,程序要输出的是i(1),而i(1)已经被赋值为i(2),所以不管 ...

明白了..谢谢
作者: Style栉    时间: 2014-3-26 19:51
学习代码 发表于 2014-3-26 16:38
这个中包含了两个知识点,一是赋值,2是自增的问题
想一下你现在定义的是 int i =3 ;在执行 i = i++;的时 ...

明白了.谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2