++i与i++
来源:互联网 发布:网游编程语言 编辑:程序博客网 时间:2024/05/17 07:17
i++与++i是特殊的自增运算,类似的还有自减操作运算i--与--i。下面从C与C++两个角度来比较这两种形式的运算方式.
1.C中
简单的地说,++i和i++,作为一个语句单独使用时(如i++;或者++i;),就是i = i + 1,它们之间没有区别。而在作为语句的一部分时,a = ++i相当于i = i + 1; a = i;通过表达式就可以看出,因为++在前,所以是先执行加1操作,再执行赋值操作。而a = i++相当于a = i; i = i + 1;++在后,所以是先执行赋值操作,再执行加1操作。
问题:试分析下面的代码在x86/Linux上的输出结果。
代码1:int main(int argc,int * argv[])
{
long i=0;
printf("%ld\n",(++i)+(++i)+(++i));
i=0;
printf("%ld\n",(++i)+((++i)+(++i)));
return 0;
}
结果:x86/Linux: 7 9
SPARC/Solaris: 6 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++和++i与C相同。但由于在C++中可以重载运算符,所以在实现新的类型对象时重载i++和++i操作与C不同。例如:
class A
{
public:
A & operator++(); //++i
const A operator++(int); //i++
};
A& A::operator++()
{
*this +=1; //先加1
return *this; //返回加1后的的值
}
const A A::operator++(int)
{
A oldValue = *this; //返回旧值
++(*this); //再加1
return oldValue;
}
从上面的++i与i++的实现看出,在C++中,对于非内建类型来说,前自增运算(++i)返回的是对象的引用,而后自增运算返回的是对象,返回对象将造成成拷贝构造函数更多的调用,所以++i的效率要高于i++。但是对于内建类型,i++与++i的效率几乎没有区别(因为内建类型没有拷贝构造函数)。于此类似的是i--和--i。(注:因为后自增运算返回的是const型对象因此后自增运算不能做左值)。
http://blog.csdn.net/wyunteng/article/details/6375692#comments
- (i++)+(i++)与(++i)+(++i)
- (i++)+(i++)与(++i)+(++i)
- (i++)+(i++)与(++i)+(++i)
- 实验:(++i)+(++i)+(++i) 与 (i++)+(i++)+(i++)
- (++i)+(++i)+(++i) 与(i++)+(i++)+(i++)表达式
- i++,i--与++i,--i 研究
- ++i *=i与 i++*= i
- ++i与i++
- i++与++i区别
- i++与++i
- C# ++ i 与 i ++
- i++与++i详解
- i++ 与++i
- i++与++i区别
- i++ 与 ++i
- ++i与i++
- ++i 与 i++
- ++i与i++区别
- poj1904 二分图匹配+强连通分量
- 详细解析Linux /etc/passwd文件
- jvm基础知识五----分代垃圾回收详细
- 相关PCB设计参数详解
- PCL资料整理
- ++i与i++
- Java 多线程 并发编程
- UE4 配置文件
- Linux不能使用FTP 命令 -bash: ftp: command not found
- android判断用户是否已登陆详细代码
- 一键分享按钮
- Java中字节流与字符流详解
- 根据已有的表创建新的表和从另外的表获取数据到新的表里面方法sql
- jvm的gc