为什么运行 i=i++ 后 i值不变?
例子:
public class temp {
public static void main(String[] args) {
int i=0;
i=i++;
System.out.println(i);
}
}
运行后输出0我认为i=i++这句是下面两句的合成
i=i;
i++;可是...不对啊...为什么?
例子:
public class temp {
public static void main(String[] args) {
int i=0;
i=i++;
System.out.println(i);
}
}
运行后输出0我认为i=i++这句是下面两句的合成
i=i;
i++;可是...不对啊...为什么?
看看这两句:
int i=0;
i=i++;
对应的虚拟机指令:
0: iconst_0 //常量0压栈
1: istore_1 //将常量0存到局部变量区"1"的位置.这个时候这个"1"位置的值是0
2: iload_1 //读出局部变量区"1"位置的值,并压栈.这个时候这个"1"位置的值还是是0
3: iinc 1, 1 //最恶心的这句...这是对"++"操作的指令优化,
直接将局部变量区"1"位 置的值+1.这个时候这个"1"位置的值变成1了
6: istore_1 //将刚才压入栈的值再存回局部变量区"1"的位置.
这个时候这个"1"位置的值又变回0了....
i++返回的值等于i i=0 所以i++这个表达式=0 i=i++ 你又把0赋值给i 所以i还是0
输出的结果当然是0c语言学的不扎实阿 哈哈
2.i=i++这个运算式的运算顺序是先执行等号右边的表达式,再将值给左边;
但i=(0)时,虽然i此时为1,但0又赋给这个i了,所以左边的i还是0;(本人见)
++i,i值先+1,然后整个表达式的值是i+1
i=++i;先自身加1,然后赋予i;初学记住就可以了!没有必要了解根本原理。
++i是先自增再把赋值
所以你的i是不变的
!!!!不会吧,还有这种写法,标准写法是i++;i会自动赋值新值得啊!!!
首先是执行i++
假如i=0
那么运行完以后i=1
但是i++=0
然后把0赋值给了i
其他的都有点臆测的味道
java虚拟机是怎么工作的我不晓得
但是c、c++里面就不是这么一回事
我调试过了
int i =0;
i=i++;
cout<<"i="<<i<<endl;
结果是1!
顺序是先i++也就是0
然后
i=0;
再在打印的时候使用自加后的值!也就是1。
我再看了一些回复
我说其他都有点臆测,有点不对
呵呵
不好意思
打字打快了
alex_fantasy()看来也用了c++调试过了,呵呵。
public static void main(String[] args) {
int i=0,i1=0;
i=i1++;
System.out.println(i);
System.out.println(i1);
}
}
俺也素初学,遇到这种问题基本都是改一下就知道怎么回事儿了.i=1,i1=1.就是先赋值后计算(后++)还是先计算后赋值的问题(前++)
但是不明白为啥System.out.println(i++);也是0....是不支持表达式赋值吗?
估计i++的实现如下:
{
int tem=i;
i=i+1;
return tem;
}
这样一般情况下i++会返回现在值,然后自加;
可是当写i=i++时,i自加后又被返回的tem覆盖了,所以i值没变。