[C.C++] C++中i++和++i的联系与区别——学习笔记

928 0
Honkers 2025-9-28 21:27:05 来自手机 | 显示全部楼层 |阅读模式

一、联系与区别-表格总结

 

  ++ii++
联系实现自加操作
区别返回值i+1i
速度较快较慢
 作为左值可以不可以

1.1解释:

(1) 返回值不一样:

前置返回的i+1;

  1. int a = 0;
  2. int b = ++a; // 结果是 b=1, a=1
复制代码

 后置返回的i;

  1. int a = 0;
  2. int b = a++; // 结果是 a=1, b=0
复制代码

所以:

i++  :先引用后增加,先在i所在的表达式中使用i的当前值,后让i加1

++i  :先增加后引用,让i先加1,然后在i所在的表达式中使用i的新值

 

(2) 执行速度不一样:

++i 速度更快的解释:因为i++需要对表达式的值进行拷贝,需要维护一个临时变量。

使用建议:

对于迭代器和其他模板对象使用前缀形式(++i)的自增、自减运算符。-------------------谷歌编程规范
 

二、源码

i++实现的代码为:

  1. int operator++(int)
  2. {
  3. int temp = *this; //先引用
  4. ++*this; //后增加
  5. return temp;
  6. }//返回一个int型的对象本身
复制代码

++i的实现代码为:

  1. int& operator++()
  2. {
  3. *this += 1; //先增加
  4. return *this; //后引用
  5. }//返回一个int型的对象引用
复制代码

则:i++返回的是i的值,而++i返回的是i+1的值。

也就是++i是一个确定的值,是一个可修改的左值,如下使用:

  1. cout << ++(++(++i)) << endl;
  2. cout << ++ ++i << endl;
复制代码

可以不停的嵌套++i。 

三、题目:

这里有很多的经典笔试题,一起来观摩下:

  1. #include <iostream>
  2. int main()
  3. {
  4. int i = 1;
  5. printf("%d,%d\n", ++i, ++i); //3,3
  6. printf("%d,%d\n", ++i, i++); //5,3
  7. printf("%d,%d\n", i++, i++); //6,5
  8. printf("%d,%d\n", i++, ++i); //8,9//特别注意!!
  9. system("pause");
  10. return 0;
  11. }
  12. //注意:这里面改变的是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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行