详细解析i++与++i

i++++i是特殊的自增运算,类似的还有自减操作运算i----i。下面从CC++两个角度来比较这两种形式的运算方式。

1.C

简单的地说,++ii++,作为一个语句单独使用时(如i++;或者++i;),就是i = i + 1,它们之间没有区别。而在作为语句的一部分时,a = ++i相当于i = i + 1; a = i;通过表达式就可以看出,因为++在前,所以是先执行加1操作,再执行赋值操作。而a = i++相当于a = i; i = i + 1;++在后,所以是先执行赋值操作,再执行加1操作。

问题:试分析下面的代码在x86/Linux上的输出结果。

代码1

详细解析i++与++i

结果:x86/Linux:7,9; SPARC/Solaris6,6

x86/Linux平台上专门有一条指令用于++i操作,那就是INC指令。INC指令直接对i进行加1操作,并将结果保存在i中,而不是寄存器中,而在SPARC/Solaris系统上,由于不存在INC指令,计算的结果将保存在寄存器中,因此运算结果为6

下面来分析一下在x86/Linux上发生了什么:

(++i) + (++i) + (++i)

++i:i = 1;

++i:i = 2;

((++i) + (++i)):i = 2;((++i) + (++i)) = 4

((++i) + (++i) + (++i)):i = 3;(((++i) + (++i)) + (++i)) = 3 + 4 = 7

(++i) + ((++i) + (++i))

++i:i = 1;

++i:i = 2;

++i:i = 3;

((++i) + (++i)):i = 3;((++i) + (++i)) = 6

(++i) + ((++i) + (++i)):i = 3;(++i) + ((++i) + (++i)) = 3 + 6 = 9

2.C++

C++中,简单类型的i++++iC相同。但由于在C++中可以重载运算符,所以在实现新的类型对象时重载i++++i操作与C不同。例如:

详细解析i++与++i

从上面的++ii++的实现看出,在C++中,对于非内建类型来说,前自增运算(++i)返回的是对象的引用,而后自增运算返回的是对象,返回对象将造成成拷贝构造函数更多的调用,所以++i的效率要高于i++。但是对于内建类型,i++++i的效率几乎没有区别(因为内建类型没有拷贝构造函数)。于此类似的是i----i。(注:因为后自增运算返回的是const型对象因此后自增运算不能做左值)。


原文链接: https://www.cnblogs.com/wyinan/archive/2011/07/21/2112759.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/29094

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午6:31
下一篇 2023年2月8日 上午6:31

相关推荐