今天做题做到这样一个题,
public static void main(String[] args) {
int i = 0;
change(i);
i = i++;
System.out.println("i = " + i);
}
public static void change(int i){
i++;
}
这道题虽然看起来很简单,但他实际上是涉及到C/C++里面的内容。首先对于change来说,因为基本数据类型(primitive data type)不会将地址传过去,所以实际上里面怎么变都没办法导致实际参数变化。
而对于i=i++来说,就有点匪夷所思了。实际上,要理解透彻i++这里,我个人认为必须要参考C++下的i++和++i。
对于i++来说,
int operator++(int)
{
int temp = *this; //先引用
++*this; //后增加
return temp;
}//返回一个int型的对象本身
因此回到题目上面,i=i++,那么等号右边的i的地址(解引用)放到temp中,然后这个右边的i自增1,最后返回temp里面的内容,显然temp里面的内容是原始的右边i信息,所以i=i++就等与了原始的右边i信息的值。
如果题目是以下代码
public static void main(String[] args) {
int i = 0;
i = ++i;
System.out.println("i = " + i);
}
因为++i的源代码类似于:
int& operator++()
{
*this += 1; //先增加
return *this; //后引用
}//返回一个int型的对象引用
那么由于没有开辟一块内存空间,他自始至终都是在同一块内存空间中操作所以他将改变main中的i值。