Java自增问题(易错)

来源:互联网 发布:苹果7蜂窝移动数据设置 编辑:程序博客网 时间:2024/06/06 20:35

首先贴段代码:

package kaoshi;import java.util.Arrays;public class Main6 {    public static void main(String[] args) {        int x[]=new int[7];        String string=new String();        string="1234567890";        int i=0;        while(i<7) {            x[i++]=Integer.parseInt(String.valueOf(string.charAt(i)));        }        System.out.println(Arrays.toString(x));    }}

亲们,觉得上面语句执行后
x中的值是怎样的?
想知道结果首先就需要搞懂这句代码是怎么执行的
x[i++]=Integer.parseInt(String.valueOf(s1.charAt(i)));
通常我们会这样想:
初始i=0;
(1)第一次:x[0]=1;更新i的值,i=1
(2)第二次:x[1]=2;更新i的值,i=2
……
依次类推,最终得到
x={1,2,3,4,5,6,7}

结果真是这样的吗?

实际发现运行输入的竟然是:
x={2,3,4,5,6,7,8}

为什么会这样呢?
下面来看看编译器的运行过程:
源代码:

反编译后的代码(部分):

16 iconst_0 : 即i=0;
17 istore_3 [i]:存储i
18 goto 38 (跳转到38执行)
21 aload_1 [x] : 取x
22 iload_3 [i] : 取i
23 iinc 3 1 [i] :i执行自增操作,
26 aload_2 [string]
27 iload_3 [i]
28 invokevirtual java.lang.String.charAt(int) : char [21]
31 invokestatic java.lang.String.valueOf(char) : java.lang.String [25]
34 invokestatic java.lang.Integer.parseInt(java.lang.String) : int [29]
37 iastore
38 iload_3 [i]
39 bipush 7
41 if_icmplt 21

看到了吗?
编译器是先执行x[i]
然后i++;接着才是Integer.parseInt(String.valueOf(string.charAt(i))),即此时从字符串中取出的不是第i个字符,而是它的下一个(即i+1编号)字符,
故x[0]=Integer.parseInt(String.valueOf(string.charAt(1)));
x[1]=Integer.parseInt(String.valueOf(string.charAt(2)));
….
依次类推就得到了上面编译器运行出的结果。`

原创粉丝点击