i的值为什莫不是11
class aaa
{
public static void main(String [] args)
{
int i=10;
i=i++;
System.out.println(i);
}
}
------解决方案--------------------应该是10,i=i++;的赋值语句中,右边的值是10,所以赋给左边的变量i也是10,语句结束
程序改造成如下,还是有同样的结果:
class aaa
{
public static void main(String [] args)
{
int i=10;
for(int j=0;j<10;j++){
i=i++;
}
System.out.println(i);
}
}
------解决方案--------------------比如我们再来看i=(i++)+(i);
表达式i++的值是10,然后i变成11,所以第二个i是11
所以右边表达式为10+11=21,最后执行赋值i=21
------解决方案--------------------这是一道经典题,曾经是sun公司的一道面试题,实际上并不像一些人理解的那么简单,很多人回答也是正确的,
int i = 10;
i = i++;
System.out.println("i= "+i);
上面打印的结果是10,为什么不是11呢?①i=②i++时,我们称呼这两个i分别是①i与②i,当a=b++;时,b会先取值再赋值然后再自增,所以i=i++;②i会先把10复制给①i,然后②i在自增1变成11,那么为什么System.out.println("i= "+i);打印的是①i而不是②i的值呢?
sun公司官方给的解释是:编译器并不认为赋值号左右2个i的地址相同的,当②地址的值加1后,以后就使用①i,而②i就消失。
因此现在编程中,良好的编程风格是i = i+1;而不再单纯的i++.
------解决方案--------------------如果是这样的话:
public class AAA{
public static void main(String [] args){
int i=10;
int y=0;
y=i++;
System.out.println("y=" + y + ", i=" + i);
}
}
那么y的值为10,而i的值为11,所以说java还是有点玄机在里面的
------解决方案--------------------要达到递增的结果,我们应该避免i=i++这种表达式(而应该用i++或i=i+1或k=i+1),它简直是个无效操作,我想10楼已经解释的很精确了。对于基本类型它唯一的作用就是改变存储此值的变量i在内存中的存储位置。
正如以下代码:
public static void main(String[] args){
int i=0;
Integer i=new Integer(0)//结果一样
for(int k=0;k<5;k++){
i=i++;
System.out.print(i);//输出结果都是0
}
for(int k=0;k<5;k++){
i++;
System.out.print(i);//输出结果0,1,2,3,4,5
}
------解决方案--------------------这种代码在实际的编程中最好不要写,是不规范,不合格的代码。