请问自增运算符++问题 int i=1;i = i++;System.out.println("i="+i);显示结果是1;对于i = i++;不是相当于i = 1; i++;吗?应该i最后的结果是2。请指教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是先把i的值(1)取出来,然后++,i=2,最后,1复制给i,,这样子吧 i++是先用,再加++i是先加,再用你试试++i是什么结果. 理论上来说是i = 1; i++,但实际上,这个和C++的做法有点不同,与Java虚假机中的实现有关。讨论这个没啥意义,实际应用中写这样的代码就应该挨骂。 实际步骤是这样的1 ++, 此时i=22 (i++)返回的是i的原始值,=13 i=i++, 所以又把i赋值成1了 j = i++=>x = ii = i + 1j = xi = i++=>x = ii = i + 1i = x i=i++;可以看出,在这条语句存在的前提下 i++所存储的变量开辟的是另一块内存 别让程序中出现i=i++这样的代码,哪怕知道这么做的结果......不直观,可读性太差......纯学习的话,应该同5楼和7楼所说的,i++会在整行语句结束后才改变i的值... 我在2002年写了一篇关于这个东西的文章,在CCW的论坛上。不过现在论坛改版,网上找不到了,只好再发一次。int i = 0; i = i++; i值为0的原因看一段程序及其运行结果:/* * @file Test.java * @author James.Fan */public class Test { public static void main(String args[]) { int i = 0; i = i++; System.out.println(i);//0 int j = 0; j = i++; System.out.println(i);//1 System.out.println(j);//0 }}查看.class文件中的指令(用JDK中的javap命令查看.class文件中的指令),可以看到如下内容(去掉了System.out.println语句之后的),“//”后面的是我写的注释Method void main(java.lang.String[]) 0 iconst_0 // 将常量 0 入栈 1 istore_1 // 出栈,并将出来的值存入第 1 个变量,这里指 i 2 iload_1 // 将 i 的值取出来入栈 3 iinc 1 1 // 对 i 进行自加运算 (这里没有影响栈中的数据) 6 istore_1 // 出栈,并将出来的值存入 i 7 iconst_0 // 下面的过程请类似的分析 8 istore_2 9 iload_1 10 iinc 1 1 13 istore_2 14 return为了搞清楚运算过程,我写了一个简单的加法程序,如下:/* * @file Test.java * @author James.Fan */public class Test { public static void main(String args[]) { int i = 3; i = i + 4; }}然后将生成的 .class 文件反编译成指令序列,如下:Method void main(java.lang.String[]) 0 iconst_3 // 将常量 3 入栈 1 istore_1 // 出栈,并将出来的值存入第 1 个变量 2 iload_1 // 将第 1 个变量中的值取出来入栈 3 iconst_4 // 将常量 4 入栈 4 iadd // 出栈两次,并将出栈的两个值相加,结果入栈 5 istore_1 // 出栈,将出来的值存入第 1 个变量 6 return iambic j = i++ => x = i i = i + 1 j = x i = i++ => x = i i = i + 1 i = x妙! 编译时‘找不到符号’的问题 不改变原数组排序 请教,HashMap如何更新数据? 关于synchronized的顺序问题 一个基本类型强制转换的困惑 测试看看可不可以有缩进 急啊!!请大家帮帮忙,java报表的问题??(100分) 谁跟我解释一下下面java多线程的经典的问题? 一个监听问题, 怎么使Applet能访问本地文件?在加载类时,出现如图所示的对话框。(http://www.cnelc.com/java.jpg) ### 正则表达式替换包含换行字符的字符串问题 ### 这个JTreet 怎么了?
++i是先加,再用
你试试++i是什么结果.
讨论这个没啥意义,实际应用中写这样的代码就应该挨骂。
1 ++, 此时i=2
2 (i++)返回的是i的原始值,=1
3 i=i++, 所以又把i赋值成1了
=>
x = i
i = i + 1
j = xi = i++
=>
x = i
i = i + 1
i = x
可以看出,在这条语句存在的前提下 i++所存储的变量开辟的是另一块内存
* @file Test.java
* @author James.Fan
*/public class Test { public static void main(String args[]) {
int i = 0;
i = i++;
System.out.println(i);//0
int j = 0;
j = i++;
System.out.println(i);//1
System.out.println(j);//0
}}
查看.class文件中的指令(用JDK中的javap命令查看.class文件中的指令),可以看到如下内容(去掉了System.out.println语句之后的),“//”后面的是我写的注释
Method void main(java.lang.String[])
0 iconst_0 // 将常量 0 入栈
1 istore_1 // 出栈,并将出来的值存入第 1 个变量,这里指 i
2 iload_1 // 将 i 的值取出来入栈
3 iinc 1 1 // 对 i 进行自加运算 (这里没有影响栈中的数据)
6 istore_1 // 出栈,并将出来的值存入 i
7 iconst_0 // 下面的过程请类似的分析
8 istore_2
9 iload_1
10 iinc 1 1
13 istore_2
14 return为了搞清楚运算过程,我写了一个简单的加法程序,如下:/*
* @file Test.java
* @author James.Fan
*/public class Test { public static void main(String args[]) {
int i = 3;
i = i + 4;
}}
然后将生成的 .class 文件反编译成指令序列,如下:
Method void main(java.lang.String[])
0 iconst_3 // 将常量 3 入栈
1 istore_1 // 出栈,并将出来的值存入第 1 个变量
2 iload_1 // 将第 1 个变量中的值取出来入栈
3 iconst_4 // 将常量 4 入栈
4 iadd // 出栈两次,并将出栈的两个值相加,结果入栈
5 istore_1 // 出栈,将出来的值存入第 1 个变量
6 return
j = i++
=>
x = i
i = i + 1
j = x i = i++
=>
x = i
i = i + 1
i = x妙!