C语言++i 与i++ 详解

i++;++i;就C语言代码来看,i++ 和 ++i 都只有一行,看起来似乎二者的执行效率一样了?其实不是的,在学习C语言时,教材和老师一般都会强调 i++ 和 ++i 的区别,例如下面这段C语言代码:

int i , j, k;i = 0;j = i++;i = 0;k = ++i;这段C语言代码执行后,j 和 k 的值并不相等:j 等于 0,k 等于 1。既然执行结果有差异,那么执行效率很有可能也是有差异的,事实的确如此。查看上述C语言代码对应的汇编代码,如下:

C语言++i 与i++ 详解_第1张图片

C语言代码对应的汇编代码

我使用的编译器为 gcc version 4.8.4。

可见,j=i++; 计算机需要 4 条指令来解释,比执行 k=++i; 多出了一条指令。多出的一条指令为:在对 i 执行自加操作之前,先保存 i 的当前值留作稍后使用(赋值为j)。

这样看来,似乎 ++i 的执行效率比 i++ 高一些?

那为了写出效率更高的C语言程序,以后是不是应该尽量使用 ++i,而不是 i++ 了呢?例如下面这样的C语言代码:

for(i=0; i<10; i++);for(i=0; i<10; ++i);是不是上面那行C语言代码的执行效率低于下面的呢?只能说理论如此,实际上,现代C语言编译器已经足够聪明,它会根据上下文编译C语言代码。

应该明白i++ 和 ++i 的效率差异主要来自于处理 i++ 时,需要先保存 i 的当前值留作稍后使用。如果之后没有人使用 i 的当前值,也就是说没有C语言代码读取 i++ 的值,编译器实在没有必要保存 i 的当前值了,因此就会将这一步优化掉。

为了便于分析,我们编写下面这样的C语言代码:

int i = 0;i++;++i;

与上面的例子相比,区别在于在执行 i++ 时,没有人关心 i 的当前值了。查看这段C语言代码对应的汇编代码:

 

显然,i++ 和 ++i 对应的指令是一模一样的,不再有执行效率上的差异。

小结

C语言中的 i++ 和 ++i 是有区别的,这就有可能带来效率上的差异。如果有代码关心 i++ 执行时的 i 当前值,程序在对 i 进行自加操作时,将不得不先保存 i 的当前值,而 ++i 就无需保存当前值,这就会带来效率上的差异。如果没人关心 i++ 的当前值,那么现代大多数C语言编译器将会将这一差异优化掉,此时 i++ 和 ++i 不再有效率上的差异。

通俗解释:  i++ 与 ++i 在表达式中有差异,即: ++i先自增1再赋值。 i++先赋值再自增1.    不在表达式中,两者无区别。

 

参考:https://baijiahao.baidu.com/s?id=1642071491559135295&wfr=spider&for=pc

你可能感兴趣的:(C语言)