C++ 的自增操作符和自减操作符

时间:2022-08-30 17:48:29

    在C++ 中自增和自减操作符为对象加1或者减1提供了很多的方便,但是他们有前置和后置两种形式,以及与其它操作混合使用容易出现错误,所以在次写下自己的理解。

    前置自增操作符,该操作使其操作数加1,操作的返回结果是修改后的数,

    前置自减操作符,该操作使其操作数减1,操作的返回结果是修改后的数,

int i = 0,j = 0;
    j = ++i;
    cout<<"i="<<i<<endl;//1
    cout<<"j="<<j<<endl;//1
    j = i++;
    cout<<"i="<<i<<endl;//2
    cout<<"j="<<j<<endl;//1

    后置自增操作符,该操作使其操作数加1,操作的返回结果是修改前的数,

    后置自减操作符,该操作使其操作数减1,操作的返回结果是修改前的数,

    

int i = 2,j = 2;
    j = --i;
    cout<<"i="<<i<<endl;//1
    cout<<"j="<<j<<endl;//1
    j = i--;
    cout<<"i="<<i<<endl;//0
    cout<<"j="<<j<<endl;//1

建议:只有在必要时才使用后置操作符!原因是:使用前置操作符需要做的工作更少,只需要加1后返回加1后的结果就行,而后置操作符需要先保存操作数原来的值,以便返回未加1之前的操作数作为操作结果。

 

在表达式中组合使用解引用和自增操作

vector<int> ivec;
    int cnt = 10;
    while(cnt>0)
        ivec.push_back(cnt--);//10,9,8...1
    vector<int>::iterator iter = ivec.begin();
    while (iter !=ivec.end())
        cout<<*iter++<<endl;//10,9,8...1

由于后自增操作符的优先级要高于解引用,所以*iter++相当于*(iter++).但是如果改成*++iter 则会出现错误,因为这样的话,ivec第一个元素没有输出,并企图对一个多余的元素进行解引用。

对于一个经典的例子:

*point1++ = *point2++;

等价于:

*point1 = *point2;
++point1;
++point2;