探讨一下(i++)语意 不是什么先++ 后++

作者:弯弯的丝瓜
函数func的定义如下:

1

2

3

4

5

voidfunc(constint& v1,constint& v2)

{

   std::cout << v1 <<' ';

   std::cout << v2 <<' ';

}

1

2

3

4

5

6

intmain (intargc,char* argv[])

{

   int i=0;

   func(++i,i++);

   return0;

}

以上为题干,输出2 0.

重点不是什么先++ 后++的问题。(当然解题技巧还是在从右往左的压栈顺序)
 

void func(const int& v1, const int & v2)
{
    cout << "&v1 = "<< &v1 << endl;
    cout << "&v2 = " << &v2 << endl;
    std::cout <<"v1 =  "<< v1 << ' ';
    std::cout <<"v2 = "<< v2 << ' ';
}

int _tmain(int argc, _TCHAR* argv[])
{

        int i = 0;
        cout <<"&i = "<< &i << endl;
        func(++i, i++);
        system("pause");
        return 0;
}

以下为VS2013测试结果

&i = 004FFA04
&v1 = 004FFA04
&v2 = 004FF938
v1 =  2 v2 = 0 请按任意键继续. . .

经过推理,最终落脚在i++,个人认为,在执行i++的之后会由编译器先制作一个副本变量,存储++之前需要处理的值,作用域类被严格限制。
 

int _tmain(int argc, _TCHAR* argv[])
{

    int i = 0;
    int a = 0;
    cout << "&a = " << &a << endl;
    const int &b = a++;
    cout << "&b = " << &b << endl;
    cout << "&a = " << &a << endl;
    cout <<"&i = "<< &i << endl;
    system("pause");
    return 0;
}


最终结论:

i++之前会返回一个右值引用;(每次读不懂的语句,好像都会落在这个点子上)

归结于如何使用右值一类问题。

参靠下面这个例子

int&& iii = 10;
int& ii = iii;  
将形参传递过程抽象出来:
const int & v2 = i++;
//展开:
int&& temp = i++;
int& v2 = temp;

将函数优化为:(避免读不懂)

void func(const int& v1, int && v2)
{
	cout << "&v1 = "<< &v1 << endl;
	cout << "&v2 = " << &v2 << endl;
	std::cout <<"v1 =  "<< v1 << ' ';
	std::cout <<"v2 = "<< v2 << ' ';
}

附上左值右值深度好文:

https://www.cnblogs.com/likaiming/p/9045642.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值