简介
在c++里,自增是一个变量自身加上一,再把新值赋值到自身变量上,自减则反之。
那么,我们可以将自增写成伪代码:
变量=变量+1
自减
变量=变量-1
那么在c++中有两种形式来吧自增自减实现出来。
//++i 的实现方式
INT INT::operator++()
{
*this = *this +1;
return *this;
}
//i++的实现方式
const INT INT::operator++(int)
{
INT oldvalue = *this;
*this = *this+1;
return oldvalue;
}
可以很清楚的看到++变量是先将自身加一,然后返回自身,而变量++则是定义一个存储变量存储变量本身,然后将变量本身加一,再返回存储变量。这明显慢了一步。
所以++i比i++更快。(也有些编译器能自动优化掉)
然而自增有些区别,但是自减没有太大的时间区别。
优化
在c++里最快的运算莫属于位运算。
位运算包含:
|
&
!
~
^
>>
<<
七种,那么自增和自减与位运算有什么关系呢?
探究
我们先来看一下~运算符。
按位取反:按二进制位各个位全部取反
我们先从自增开始
自增
例:
~5:
5的原码:
00000101
补码:
00000101
按位取反:
11111010
注意最前面的符号是正负数
得到了取反后的补码,把补码化成反码
注意负数的补码换反码是反码=补码-1
换码
11111001
负数的反码按位取反就是原码,符号位不变
10000110
结果就是-6
注意到了什么没有?,-6与5,5与-6,把-6转正成为6,5和6,这不就是自增吗?
那么我们就可以把它写成公式:i+1=-~i
自减
这里可能有人会说:我们都有了自增了,那自减不就是自增-2吗,简单简单。
可以但是还可以优化
再怎么优化呢?
我们还得用上按位取反。
按位取反是-(i+1)
那么如果现将i转号呢
-((-i)+1)
=0-(1-i)
=0-1+i
=i-1
i-1!
这就是自减啊。
总结
虽然这些歪门邪道的方法能优化一点点时间复杂度,但是编译器自带的优化一般也会将时间复杂度化成这么多,所以只要不是特别需要,++i和--i已经够用了。