“i++”有其历史原因,和CPU架构、编译器的优化都有关系
【本文由“观方评论”推荐,来自《我兴致勃勃地想学编程,却被这组运算符劝退了》评论区,标题为观方评论添加】
这个问题有其历史原因,和CPU架构、编译器的优化都有关系。
1、毫无疑问,由于需要进行数组索引、循环变量控制等操作,对变量+1或-1的运算在代码运行时是非常频繁的,所以
2、cpu有专门的用于+1或-1的指令比如INC/DEC,如果编译器能把i=i+1这样的语句准确翻译成INC/DEC这些专用指令,在处理类似这些运算时,速度比通用的加法/减法指令要快非常多(以数量级计)。快这么多,除了专用指令,还涉及到寄存器/内存寻址等问题
3、寄存器简单来说可以理解成CPU内部用来存储数值的单元,CPU指令访问寄存器是最短的路径最快的速度,内存本存取速度就比寄存器慢非常多,还要外加内存寻址的开销。举个不是很恰当的例子,就像快递直接投递到你家和投递到驿站你从家过去取再回家的区别。
4、现在再回头看i++/i--的问题,C语言是最接近机器语言的高级语言,这两个运算符直接映射成对应的机器指令是不是顺理成章的事?对应的变量i直接放寄存器,没有比这更高效的+1/-1了,这里我们把i=i+1写成i++相当于人肉对编译器进行优化。现代编译器基本上都可以自动优化i=i+1,如果你喜欢写i=i+1而不是i++,这也没什么问题。
5、++i还是i++?
在表达式里面,运算符本来就有优先级的问题,比如加减乘除谁先谁后(不加括号的情况下)。++/--既然也是个运算符,那么也会有优先级的问题,只不过这俩货有点特别,它们是针对自身进行运算。详细的解释在这里:https://zhidao.baidu.com/question/271033423.html?entry=qb_uhome_tag
以上全凭印象手机录入,如有不准确的地方还请见谅