[java/C++/misc]i=i++

5 篇文章 0 订阅
3 篇文章 0 订阅

今天做题做到这样一个题,

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值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值