答:理论上++i更快,实际与编译器优化有关,通常几乎无差别。 
i++实现的代码为:

//i++实现代码为:
int operator++(int)
{int temp = *this;                                     ++*this;                                             return temp;
}//返回一个int型的对象本身
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

++i的实现代码:

// ++i实现代码为:
int& operator++()
{*this += 1;return *this;
}//返回一个int型的对象引用
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

i++和++i的考点比较多,简单来说,就是i++返回的是i的值,而++i返回的是i+1的值。也就是++i是一个确定的值,是一个可修改的左值,如下使用:

    cout << ++(++(++i)) << endl;cout << ++ ++i << endl;
  • 1
  • 2
  • 1
  • 2

可以不停的嵌套++i。 
这里有很多的经典笔试题,一起来观摩下:

int main()
{int i = 1;printf("%d,%d\n", ++i, ++i);    //3,3printf("%d,%d\n", ++i, i++);    //5,3printf("%d,%d\n", i++, i++);    //6,5printf("%d,%d\n", i++, ++i);    //8,9system("pause");return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

首先是函数的入栈顺序从右向左入栈的,计算顺序也是从右往左计算的,不过都是计算完以后在进行的压栈操作: 
对于第5行代码,首先执行++i,返回值是i,这时i的值是2,再次执行++i,返回值是i,得到i=3,将i压入栈中,此时i为3,也就是压入3,3; 
对于第6行代码,首先执行i++,返回值是原来的i,也就是3,再执行++i,返回值是i,依次将3,5压入栈中得到输出结果 
对于第7行代码,首先执行i++,返回值是5,再执行i++返回值是6,依次将5,6压入栈中得到输出结果 
对于第8行代码,首先执行++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 
下面是使用其他编译器输出的结果:

//------ C++ version ------
#include <cstdio>
int main()
{int i = 1;printf("%d %d\n", ++i, ++i);printf("%d %d\n", ++i, i++);printf("%d %d\n", i++, i++);printf("%d %d\n", i++, ++i);return 0;
}//------ C version ------
#include <stdio.h>
int main()
{int i = 1;printf("%d %d\n", ++i, ++i);printf("%d %d\n", ++i, i++);printf("%d %d\n", i++, i++);printf("%d %d\n", i++, ++i);return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

上面是参考的执行代码。 
gcc-5.1(C++) gcc-5.1(C++14) gcc-5.1(C) 的执行结果:

3 3
5 3
6 5
8 9
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

gcc-4.3.2(C++) clang-3.7(C++) clang-3.7(C) 的执行结果

2 3
4 4
5 6
7 9
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

gcc-5.1(C99 strict) 的编译结果:编译不通过。

C99 strict prog.c: In function 'main':
prog.c:6:28: error: operation on 'i' may be undefined [-Werror=sequence-point]printf("%d %d\n", ++i, ++i);^
prog.c:7:29: error: operation on 'i' may be undefined [-Werror=sequence-point]printf("%d %d\n", ++i, i++);^
prog.c:8:29: error: operation on 'i' may be undefined [-Werror=sequence-point]printf("%d %d\n", i++, i++);^
prog.c:9:28: error: operation on 'i' may be undefined [-Werror=sequence-point]printf("%d %d\n", i++, ++i);^
cc1: all warnings being treated as errors
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

由上可见,这种比较毫无意义。

C++中i++和++i的区别相关推荐

  1. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  2. java中separator_java - File.separator和路径中的斜杠之间的区别

    java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...

  3. PHP中self和static的区别,php中self与static的区别

    原文链接,猛击这里. php中self与static的区别 通过一些示例,我们可以很容易看出self和static的区别.假定我们有class Car – 它有两个方法,model和getModel. ...

  4. php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析

    本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...

  5. php $this self,php中self与$this的区别

    学习php中self与$this的区别. 先来看下parent与self的例子: /* * parent与self的区别 * by www.jbxue.com */ class A{ function ...

  6. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  7. python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...

    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...

  8. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  9. SQL中where与having的区别

    SQL中where与having的区别 目录 SQL中where与having的区别 创建表 插入数据 进行聚合操作 # WHERE是在聚合之前进行数据行的过滤而HAVING实在聚合之后进行新数据的过 ...

  10. mysql''和null,mysql中NULL和null的区别

    接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...

最新文章

  1. Task04:青少年软件编程(Python)等级考试模拟卷(一级)
  2. 在ubuntu14.04 64位中使用jd-gui
  3. CCIE-LAB-SDN-第六篇-SDWAN-Branch2-vEdge-51-vEdge-52
  4. 循环矩阵与傅里叶相关的几点性质
  5. Python_软件安装
  6. Codeforces 938.C Constructing Tests
  7. USB 协议分析之 HID 设备(转)
  8. 近两万字 TCP 硬核知识,教你吊打面试官!
  9. 语音识别相关书籍抖音十大先看哪一本最好
  10. 【CSS】CSS样式的优先级
  11. Office KMS主机搭建
  12. 我的梦想是成为一名计算机程序员英语怎么说,英语作文。我的梦想、我的梦想是成为电脑程序员。。80词...
  13. vant中的swipe
  14. 用极大似然法估计因子载荷矩阵_[转载]第三十六课         因子分析
  15. 关于神经网络算法使用场景的思考
  16. 计算机应用知识试题 上学吧,自考计算机应用高分技巧,自考计算机应用作答技巧...
  17. 【学习记录2】数组里的字符串转换成数字或者把数字转换成字符串
  18. Integer 用法
  19. 【LeetCode 二分查找专项】最长递增子序列(300)(to be polished...)
  20. aizuda 学习之 @ControllerAdvice 和RequestBodyAdviceAdapter运用 自动配置介绍

热门文章

  1. python计算微积分_python 微积分计算
  2. IGCT器件是什么?
  3. 模2加法,模2减法,模2除法
  4. java订餐管理系统代码,基于JAVA的订餐管理系统
  5. 基于计算机视觉原理的自主足球机器人位置规划,基于计算机视觉原理的自主足球机器人位置规划...
  6. 华硕 小布 类似机器人_盘点足球赛事背后的高科技 华硕机器人小布化身观赛助理...
  7. YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
  8. ios手动重签名在非越狱手机上安装自己破解的app
  9. html音乐播放器收起展开代码,JS模拟酷狗音乐播放器收缩折叠关闭效果代码
  10. Stata 16(统计学软件) v16.0中文版安装教程