一、联系与区别-表格总结
| | | ++i | i++ | | 联系 | 实现自加操作 | | 区别 | 返回值 | i+1 | i | | 速度 | 较快 | 较慢 | | | 作为左值 | 可以 | 不可以 |
1.1解释:
(1) 返回值不一样:
前置返回的i+1; - int a = 0;
- int b = ++a; // 结果是 b=1, a=1
复制代码
后置返回的i; - int a = 0;
- int b = a++; // 结果是 a=1, b=0
复制代码
所以:
i++ :先引用后增加,先在i所在的表达式中使用i的当前值,后让i加1
++i :先增加后引用,让i先加1,然后在i所在的表达式中使用i的新值
(2) 执行速度不一样:
++i 速度更快的解释:因为i++需要对表达式的值进行拷贝,需要维护一个临时变量。
使用建议:
对于迭代器和其他模板对象使用前缀形式(++i)的自增、自减运算符。-------------------谷歌编程规范
二、源码
i++实现的代码为: - int operator++(int)
- {
- int temp = *this; //先引用
- ++*this; //后增加
- return temp;
- }//返回一个int型的对象本身
复制代码
++i的实现代码为: - int& operator++()
- {
- *this += 1; //先增加
- return *this; //后引用
- }//返回一个int型的对象引用
复制代码
则:i++返回的是i的值,而++i返回的是i+1的值。
也就是++i是一个确定的值,是一个可修改的左值,如下使用: - cout << ++(++(++i)) << endl;
- cout << ++ ++i << endl;
复制代码
可以不停的嵌套++i。
三、题目:
这里有很多的经典笔试题,一起来观摩下: - #include <iostream>
- int main()
- {
- int i = 1;
- printf("%d,%d\n", ++i, ++i); //3,3
- printf("%d,%d\n", ++i, i++); //5,3
- printf("%d,%d\n", i++, i++); //6,5
- printf("%d,%d\n", i++, ++i); //8,9//特别注意!!
- system("pause");
- return 0;
- }
- //注意:这里面改变的是this 还是 i 还是 tmp
复制代码
3.1 题目解析:
首先是函数的入栈顺序从右向左入栈的,计算顺序也是从右往左计算的,不过都是计算完以后在进行的压栈操作:
对于第6行代码,首先执行++i,返回值是i,这时i的值是2,再次执行++i,返回值是i,得到i=3,将i压入栈中,此时i为3,也就是压入3,3;
对于第7行代码,首先执行i++,返回值是原来的i,也就是3,再执行++i,返回值是i,依次将3,5压入栈中得到输出结果
对于第8行代码,首先执行i++,返回值是5,再执行i++返回值是6,依次将5,6压入栈中得到输出结果
对于第9行代码,首先执行++i,返回i,此时i为8,再执行i++,返回值是8,此时i为9,依次将i,8也就是9,8压入栈中,得到输出结果。
上面的分析也是基于vs搞的,不过准确来说函数多个参数的计算顺序是未定义的(the order of evaluation of function arguments are undefined)。笔试题目的运行结果随不同的编译器而异。
参考:http://www.stroustrup.com/bs_faq2.html#evaluation-order
参考资料:
在程序开发中,++i 与 i++的区别在哪里?:https://www.zhihu.com/question/19811087
C/C++语言中 i++ 和 ++i 有什么区别?:http://www.slyar.com/blog/c-zizeng.html |