不再纠结前置++与后置++

前置++与后置++的区别

《C专家编程中》中提到:
++a表示取a的地址,增加它的内容,然后把值放在寄存器中;
a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值;

另外,博主也亲自测试了一波,代码如下:

#include <iostream>

using namespace std;

int main()
{
    int i=0,j=0,k=0,l=0;
    int tem1,tem2,tem3,tem4;
    tem1 = (++i)++;
    tem2 = ++(++j);
    tem3 = ++k;
    tem4 = l++;
    cout << i <<endl;  //i=2
    cout << j <<endl;  //j=2
    cout << k <<endl;  //k=1
    cout << l <<endl;  //l=1
    cout << tem1 << endl;  //tem1=1
    cout << tem2 << endl;  //tem2=2
    cout << tem3 << endl;  //tem3=1
    cout << tem4 << endl;  //tem4=0
    return 0;
}

由上可以看出,这两者的区别:
1. 前置++与后置++在单独使用时,其计算结果并没有区别。
2. 前置++与后置++在与=、>、<、>=、<=等运算符在一起使用时,则会凸显出两者的不同。即前置++会在在与以上的操作符计算之前,会先增加自己的值,而后置++会在与以上操作符计算之后在增加自己的值。原因与它们的实现有关

另外,在网上找了一篇文章,通过运算符重载的角度探讨了它们的不同,如下:
假设有一个类Age,描述年龄。该类重载了前置++和后置++两个操作符,以实现对年龄的自增。

class Age     
{     
public:     

    Age& operator++() //前置++     
    {     
        ++i;     
        return *this;     
    }     

    const Age operator++(int) //后置++     
   {     
        Age tmp = *this;     
        ++(*this);  //利用前置++     
        return tmp;     
    }     

    Age& operator=(int i) //赋值操作     
    {     
        this->i = i;     
        return *this;     
    }     

private:     
    int i;     
};    

从上述代码,我们可以看出,总结一下前置++与后置++有3点不同:
1.返回类型不同
2.形参不同
3.代码不同
4.效率不同

这里重点讲一下返回类型不同和效率不同。

返回值类型不同

前置++的返回类型是引用Age&,后置++的返回类型是常量const Age。这就可以说明为什么后置++不能被赋值,也不能被++(无论前置后置),而前置++却可以。

效率不同

前置++的效率更高,而后置++会生成临时对象。所以无论是工作学习,都应该优先考虑使用前置++。

关于指针方面的++操作

引用牛客网上的一道题,代码如下:

#include<stdio.h>
 struct S
 {
    int n;
    char c[10];
 } *p;
 main()
 { 
    struct S a[3]={{3,"abc"},{5,"def"},{7,"ghi"}};
    p=a;
    printf("%d,",(*p).n);
    printf("%d\n",___________);
 }

A. (++p)->n
B. (a+1)->n
C. p++->n
D. (p+1)->n
链接如下:
https://www.nowcoder.com/questionTerminal/51d57bfe45f54e05b8f8033f2d8a69ff?toCommentId=545993
这道题主要把握一点,成员选择符->优先级比前置++、后置++都要高。所以很容易知道答案就是ABD。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值