请问int i=0; i=i++;执行这2句话后变量i的值为什么是0的?
不是1吗?
不是1吗?
解决方案 »
- 请教下java C/S聊天室几个问题~~
- 下面代码的数据结构如何理解 Map<Integer, List>?
- 求一个正则表达式: 空格不能连续
- 俺是初学java的,用什么工具比较好啊?
- 请各位大侠赐教-对数据库操作的问题
- 问一个图标问题!
- 请教,弱弱问题2,关于BufferedImage
- 做java的朋友建议看看。很漂亮的
- 在JAVA中如何实现C中的结构体数组的功能?
- WIN2000下面,JDK安装成功,但是变量定义为什么不行呢?
- java0基础菜鸟自学求助。
- Exception in thread"main"java.lang.ClassCastException: thepvc cannot be cast to
是先执行i=i;//此时i = 0
再执行i++;i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i
我们对比两段程序和它们的汇编代码(javap -c xxx得到):
int i=0; i=i++; int i=0; i=++i; ------------------------------------------------------------------------------------
0: iconst_0 0: iconst_0
1: istore_2 1: istore_2
2: iload_2 2: iinc 2, 1
3: iinc 2, 1 3: iload_2
4: istore_2 4: istore_2
5: return 5: return
它们区别在于2,3两句。
从优先级来看 "前++" >" =" > "后++",所以汇编代码清楚地显示了代码执行地过程。
第二段代码地结果是1,没有问题。
从汇编代码来看,=赋值地过程是先利用临时变量计算=右边地值,然后在赋给左边地变量。
这样,我们就很容易解释第一段代码地运行结果了:
临时变量先得到i原来地值是0(汇编代码1),这时候考虑优先级,=大于后++,所以临时变量就执行赋值操作,
之后临时变量先读出i地值(汇编代码2),再进行++操作(汇编代码3),但是++操作只是在临时变量自己身上加一,不会影响原来地i值。
按照上面地思路再分析第二段代码,也就顺理成章了:)
http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html
public static void main(String arg[]){
int i=0,j=0;
j=i++;
System.out.print("i = " + i + "\n" + "j = " + j);
}
}i = 1
j = 0
int i=0;初始化i为0,i=i++;首先考了一个赋值运算的方向性,最后当然是自增啦,
首先要求赋值号右边的自增表达式了,i++的值是0,如果是++i则是1,把0赋值给变量i,
结果当然是0了。你是误以为把i++后i的值为1后赋值给变量i。
int j=i++;
response.write(i.tostring());结果 1response.write(j.tostring());
结果 0
按c的方式分析这个问题准错
2.再i++自增 为1;
3.将第一步得到的0赋值给i,所以i最后的值为0
int i=0;
i=i++;
i=i++;
.......
不管加多少次,最后i都是0,通过看字节码更容易深层次理解虚拟机的执行过程。
i=i++;
system.out.println(i);
为什么i没++呢就执行打印操作了呢?
操作分3步:
1取出i的数值
2将i的值加上1
3将第一步得到的值付给i
不是1吗?
i++是先赋值再自增,故0++先把0赋给i,再自增,如果再输出i,就是1了。
是先执行i=i;//此时i = 0
再执行i++;i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i
1.首先i被赋值为0,并保存在它的存储空间;
2.接着的“i=i++;”是将i的值0取出来,把0值放在相应的寄存器,然后将执行i++操作
3.最后将相应寄存器的0值赋给i;
所以最后i的值为0.当然这个在C++中执行的话具体结果又会不一样,这与其的具体实现操作有关,所以不要复杂地使用++和--操作,不一理解而且可能会有歧义
int temp=0;
//++i
int add(){
i=i+1;
temp=i
return temp }
//i++
int add(){
temp=i;
i=i+1;
return temp;
}
//进行I++,++I运算得有三点。
1、运算符的优先级。
2、I++,++I 都返回是一个中间变量的结果。只是这个中间变量赋值的时间不同。
3、I++,++I运算过后,i的值都会加1;
C和JAVA 的运行结果是不同的,所以如果只是分析 前++和后++的优先级问题,恐怕还得慎重思考……
int j=i;
i++;
return j;所以i=i++;相当于
int j=i;
i++;
i=j;
对于i=i++是先将i的值赋值给i,再对i进行加1,在加后没有对i赋值,所以i的值是没有变的,先i=i; i+1
对于i=++i是先给i+1,然后将结果赋值给i,即i=i
是先执行i=i;//此时i = 0
再执行i++;i = ++i;
先执行++i;//此时i = 1
再把上面的结果集给i
int i=0;
printf("%d",i++);
你看看输出什么。