关于自增、自减运算符的笔记

一直以来,我对于自增、自减运算符都停留在一个很初级的水平:

即单纯的将变量+1或-1,根据运算符前置或后置的情况,来决定返回进行运算前的值还是运算后的值

但是!直到最近经常接触左值(l-value),右值(r-value)概念,然后又看到一篇文章提到过关于自增运算符的知识,于是就学习学习,今天来做点笔记。

首先,是关于左值、右值的概念,这些概念认真讲可以讲很多,所以就简单说一下吧:
左值(location-value): 左值可以出现在赋值运算符的左侧,也可以出现在右侧,一般可读可写
右值(read-value):右值只可以出现在赋值运算符的右侧,只可读,不可写

现在,我们来聊一聊自增运算符以a++、++a为例:

a++,是先取出a的一份拷贝,然后增加a的值,最后返回之前的拷贝,所以返回值类型是右值。
++a,是先增加a的值,再返回a的引用,所以返回值类型是左值。

所以,(++a)=a++可以编译,++++a可以编译,a+++不可以编译,++a++也不可以(因为++运算符结合方向是自右向左)

PS:这里顺便提一下重载++运算符,当我们为一个类重载++运算符的时候,我们并不能从参数上区分前置自增和后置自增(当然从返回值类型可以区分),这个时候,c++做出了规定:

C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数

举例说明:

class Int
{
    public:
    Int & operator++();         //前缀
    Int & operator--();
    const Int operator++(int);  //后缀
    const Int operator--(int);
}

资料来源:
http://blog.xieyc.com/prefix-and-suffix-forms-of-the-increment-and-decrement-operators/
http://www.cnblogs.com/maxwellp/archive/2012/02/11/2346844.html

你可能感兴趣的:(C/C++)