关于 C 语言的 i++ 和 ++i

有不少童鞋是大学学习 C 语言的,而其中提到了 i++++i 的问题,经常有人问我 i++++i 有什么区别,其实本来没啥必要纠结,但是毕竟天朝嘛,应试教育,有必要写个文章给大家系统地梳理下咯。

一直以来,i++++i 都是个头疼问题,有什么区别?那么我来记录一下…

先看看微软给的解释:

IfEquivalent ActionReturn value
++variablevariable += 1value of variable after incrementing
variable++variable += 1value of variable before incrementing

可以看到,两者区别不大,简单说 ++i 是先加后用,i++ 是先用后加,但是问题出在哪呢?

我们贴一段代码:

1
2
3
4
int i, j, k;
i = j = 4;
k = i++; // i = 5 ,k = 4
k = ++j; // j = 5 ,k = 5

这样结果应该很明了了,不需多解释了,如果是赋值时候,一定要注意,否则后果很严重。

不过,如果是用在 for 循环上,有何差异呢?比如:

1
2
3
4
for(int i=0;i<=5;i++) {
}
for(int i=0;i<=5;++i) {
}

其实运行结果是相同的,这里无需纠结。但谷歌的文档是这么写的(山野哥翻译):

- ++ii++ 原则:忽略返回值的时候,前缀形式(++i)至少不会比后缀形式效率低,甚至更高,因为后缀形式自加或者自减,需要保存i的原始值作为表达式的值,如果i是迭代器或者其他被标准类型,复制操作的代价可能更大。 所以我们应该尽量使用前缀++形式,特别是使用STL迭代器的情况。

根据谷歌的文档,那我们在循环中还是尽量使用 ++i

到此为止,这个 i++ 还是个头疼的问题,那么如何彻底解决这个问题?

答案很简单:

不用它。

i++++i 根据微软的指令都是 i + =1,那么何必让这种费脑筋的代码继续霸道呢?

我的建议:能分开写就分开写。

如有错误,欢迎指出~

Licensed under CC BY-NC-SA 4.0
最后更新于 Oct 28, 2015 05:59 UTC
使用 Hugo 构建
主题 StackJimmy 设计