c++中前置++与后置++的区别
自增(++)与自减(--)是我们经常会用到的运算符,然而很多情况下我们并不注意要用前置还是后置。本文就自增(++),讨论前置++与后置++的不同点,浅析两者的用途(自减运算符同理)。
1.运算时机不同
一般情况下在while循环中我们会有如下用法:
while (...) {
...
//++i;
i++;
}
此处无论是前置自增还是后置自增,效果都类似于 i += 1,因为这是单独的运算,没有与其他的表达式参与运算。
换句话说,如果有其他表达式参与其中,那么运算结果将截然不同。参考以下代码:
int i = 1; int num1 = ++i + 1; int j = 1; int num2 = j++ + 1; cout << num1 << endl;//num1 = 3; cout << num2 << endl;//num2 = 2;
前置运算符之所以叫前置运算符,不是没有道理的。在参与表达式计算中,有前置运算符的效果会先行清算,也就是说,上述代码中的i会先自增然后再+1赋值给num1。即num1 = i(=2) + 1;
与之对应的,后置运算符的效果则在一行的运算结束后再清算,也就是说j会+1赋值给num2,然后再自增。即num2 = j(=1) + 1;j += 1;
2.运算效率不同
由于上一条中前置运算符与后置运算符的运算特性,前置运算符返回结果是左值(可以在赋值符号左侧),后置运算符的返回结果是右值(只能出现在赋值符号右侧)。后置运算符为了达到这一效果,必须保存变量未自增前的值,以便于后续返回,因此总体来说后置运算符会有额外的开销,并不等价于 += 1。废话不多说,直接上测试代码:
size_t n = 1e3; clock_t duration = 0; clock_t start = 0, finish = 0; vector<int> vec(n); for (int i = 0; i < n; ++i) { start = clock(); for(auto it = vec.begin(); it != vec.end(); ++it){} //for(int i = n; i > 0; --i){} finish = clock(); duration += finish - start; } cout << "总运行时间为:" << duration << "毫秒" << endl;//前置运算符 381ms for (int i = 0; i < n; ++i) { start = clock(); for (auto it = vec.begin(); it != vec.end(); it++) {} //for (int i = n; i > 0; i--) {} finish = clock(); duration += finish - start; } cout << "总运行时间为:" << duration << "毫秒" << endl;//后置运算符 1234ms
具体运算时间肯定会有一定出入。但是通过以上测试可以明显发现,在遍历中运用自增或者自减时,前置运算会比后置运算快不少。

浙公网安备 33010602011771号