前置++与后置++的区别
《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。