关于++的问题

tank8830 2011-09-16 09:39:13
int b = 10;
b = b++;
System.out.println(b); // 输出10

那个+1的操作怎么没了,不管++在前还是在后都应该有一个+1的操作吧,那么这个操作是在什么时候什么地方执行的。
...全文
111 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaSavior7 2011-09-16
  • 打赏
  • 举报
回复
这是我当时看的代码,其实感觉i++和++i 具体讨论没啥用。

代码1:

public class Test{
public static void main(String[] args){

int i=0;

i=i++;

System.out.println(i);

}

}


结果i依然是0.分析其反编译后的代码:

public static void main(java.lang.String[]);
Code:

0: iconst_0 //0放到栈顶

1: istore_1 //把栈顶的值保存到局部变量1,也就是i中

2: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0

3: iinc 1, 1 //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。

6: istore_1 //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0

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



值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0

代码2:

public class Test2{
public static void main(String[] args){

int i=0;

int j=0;

j=i++;

System.out.println(i);

System.out.println(j);

}

}



这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码:

public static void main(java.lang.String[]);
Code:

0: iconst_0

1: istore_1 //i=0

2: iconst_0

3: istore_2 //j=0 4: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0

5: iinc 1, 1 //局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化

8: istore_2 //把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0

9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

12: iload_1

13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V

16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

19: iload_2

20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V

23: return

很明显可以看出,java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。

代码3:

public class Test3{

public static void main(String[] args){

int i=0;

int j=0;

j=++i;

System.out.println(i);

System.out.println(j);

}

}



结果大家也都知道,i=1,j=1

看操作过程:

public static void main(java.lang.String[]);

Code:

0: iconst_0

1: istore_1 //i=0

2: iconst_0

3: istore_2 //j=0

4: iinc 1, 1 //局部变量i加1,这时候i变成1了 。

7: iload_1 //把i的值放到栈顶,栈顶的值是1

8: istore_2 //j=1

9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

12: iload_1

13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V

16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;

19: iload_2

20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V

23: return

对比代码2和代码3,关键的差别就是iload_1 个iinc这两条指令的位置变了。
buliar 2011-09-16
  • 打赏
  • 举报
回复
个人理解下
b=b++
先做了b=b
然后你想做的b++中的原始b其实已经不存在了。只是做了5++,但是没有任何变量=这个5++了,其实编译器应该抛弃了++这个运算吧
tank8830 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yuyeyi 的回复:]
java是传值引用的也就是说你把东西放进去,
没有return出来的话,值是不会改变的。
所以打印的还是10
[/Quote]
能不能说的具体些 为什么没有return出来
b=b++和b++有什么区别
yuyeyi 2011-09-16
  • 打赏
  • 举报
回复
java是传值引用的也就是说你把东西放进去,
没有return出来的话,值是不会改变的。
所以打印的还是10
tank8830 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oracleeason1 的回复:]
int c,b = 10;
c = b++;
System.out.println(c); //10
System.out.println(b); //11
这是显然的

解释lz这种情况只能这样,b++是先将b值存储起来,然后b执行++,再把开始存储起来的值赋给了b 所以b还是没变
[/Quote]
可是b=b++不是代表着先赋值再+1吗
  • 打赏
  • 举报
回复

int c,b = 10;
c = b++;
System.out.println(c); //10
System.out.println(b); //11
这是显然的

解释lz这种情况只能这样,b++是先将b值存储起来,然后b执行++,再把开始存储起来的值赋给了b 所以b还是没变
buliar 2011-09-16
  • 打赏
  • 举报
回复
b=b++和b=b有区别么
tank8830 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 k3108001263 的回复:]
它的确是加了,但加了之后你没有保存起来,所分
这里以打印不出来
[/Quote]
怎么算保存起来呢
int b = 10;
b++;
System.out.println(b); // 输出11

int b = 10;
b = b++;
System.out.println(b); // 输出10

b++操作可以理解为b=b+1
那么b=b++我理解成
b=b=10;
b=b+1;
这样就是赋值后再加了,我这样理解有什么错?
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jsut_yi 的回复:]
b++ 和 ++b 不同,b++是先赋值然后加1,而++b是先加1 然后赋值
[/Quote]
+1
打油的程序员 2011-09-16
  • 打赏
  • 举报
回复
它的确是加了,但加了之后你没有保存起来,所分
这里以打印不出来
打油的程序员 2011-09-16
  • 打赏
  • 举报
回复

int b = 10;
int c = b++;
System.out.println(b); // 输出11
System.out.println(c); // 输出10

jsut_yi 2011-09-16
  • 打赏
  • 举报
回复
b++ 和 ++b 不同,b++是先赋值然后加1,而++b是先加1 然后赋值

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧