首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包
请大家来详细谈一下 "前缀++,后缀++ "和 "前缀--,后缀-- "
发表时间:2007-07-27 14:40:49   楼主:nemo0976

在C++中常常要用到"前缀++,和后缀++" ,但很多时候自己对这个"++"和"--"有点疑惑,如果他单独是一条语句如:

int i;

i++;

++i;

这样很清楚,但更多的情况下他是作为一个复合语句来用的如:

while(i++){...}

while(++i){...}

while(i){i++;}他们三者的区别;

-------------------------------------------------------

还有就是:

for(i=0 ;i<10;++i)和for(i=0;i<10;++i)的区别;

--------------------------------------------------------

 如果对i++,++i 在一般的四则运算中加上()变成a+(++i)或a+(i++)的区别又是什么

--------------------------------------------------------------------------------------------

如果把i++,++i作为函数的实参传递给函数,他的运做又是怎么样的,

int i(1);

fun(i++)和fun(++i)

实际传递到函数中的是2还是1,请大家详细讲讲!





 
发表时间:2007-08-01 18:13:33 1 楼:qvly

参见《More Effextive C++ 中文版》条款6。(Scott Meyers著,侯捷译)

在C++编译器中,前置式(++i)和后置式(i++)的实现方式大体如下:

 

前置式:

UPInt& UPInt::operator++()

{

    *this += 1;        // 累加

    return * this;    //  取出

}

 

后置式:

const UPInt UPInt::operator++(int)

{

    UPInt oldValue = *this;    // 取出

    ++(*this);                        // 累加

    return oldValue;              // 返回先前被取出的值

}

 

while(i++)与while(i){i++;}一样,他们和while(++i)不一样,前者进入循环体的是i,后者进入循环体的是i+1。

for(i=0 ;i<10;++i)和for(i=0;i<10;++i)没有区别;

 

int i(1);

fun(i++)传递到函数中的是1,fun(++i)传递到汉书中的是2。

 

由上述实现可知,前置式返回一个引用,后置式返回一个const临时对象。当大型的数据类型做此操作时,后置式比前置式效率高。

比如:

class CMyClass

{

    // 很多数据

 

CMyClass myobject;

 

myobject++;    // 效率较低,因为要返回一个 CMyClass类的临时对象,编译器在构造此临时对象时,要调用此类的构造函数。

++myobjecy;   // 效率较高,不用返回一个临时对象。

 

对于这种较多数据的类,尽可能使用后置式。

发表时间:2007-08-10 11:22:50 2 楼:cqviolet

More Effextive C++ 中文版

 

不适合我等初学者看的

发表时间:2007-08-13 12:08:02 3 楼:powerqt

1楼,你的解释很好,不过你可能打错了:

************************************************* 

前置式:

UPInt& UPInt::operator++()

{

    *this += 1;        // 累加

    return * this;    //  取出

}

 

后置式:

const UPInt UPInt::operator++(int)

{

    UPInt oldValue = *this;    // 取出

    ++(*this);                        // 累加

    return oldValue;              // 返回先前被取出的值

}

**************************************************

按照这个判断,++i 就是前置式了,i++就是后置式了,

你接下来说:

 当大型的数据类型做此操作时,后置式比前置式效率高。

据此判断,myobject++ 比 ++myobject效率高了,可是你说:

 

myobject++;    // 效率较低......

++myobjecy;   // 效率较高......

 

那么请问谁的效率高?这个问题我没弄明白!

 

 

发表时间:2007-08-23 08:46:13 4 楼:skyyby

1楼的太有才了

think you

不过myobeject++这个后置式会产生临时对象,是++myobject这个前置式的效率高吧

 

 

结论应该是 

大型数据类型操作是应该用前置的

 

发表时间:2007-08-24 08:38:01 5 楼:xiao_ke

搞的那么复杂 ++I,就是先加1,再取I的值

                   I++ ,先取I的值,再加1 

 

随便它用在那个地方,这个都解释的通,它是表达试。

发表时间:2007-08-24 08:42:36 6 楼:xiao_ke
还有就是在 基本数据类型 上面++的实现,绝对不是用运算符重载实现的。
发表时间:2007-11-19 15:21:53 7 楼:ppp_10001

i++是i先参与运算再自加1

++i是i先自加1再参与运算

发表时间:2007-11-24 20:30:13 8 楼:cnim549405865

我是一个初学者,我对这个问题也有一些看法。

i++是后缀加,这个是在运算时取到i的值在加。

++i 是前缀加,这具是在运算前先加在取i的值。

for(i=0 ;i<10;++i)和for(i=0;i<10;++i)的区别依我之见。没有什么区别。

for(i=0;i<10;++i)是一个条件。定义i的取值范围。

                   ++i在这里也是在运算前先加在取i的值。

小人之见,信者则信。不信者不信,

如有问题,望高人指点。谢谢。

发表时间:2007-12-15 12:43:14 9 楼:caiybin

我还是一个菜鸟:说一下,

i++是先用i的值,用完后再加1。

++i是先让i的值加一后再用i的值;

好像你的for(i=0 ;i<10;++i)中i的初值是0,但是却是从i=1开始的;

不过我想一般都是用for(i=0 ;i<10;i++)比较多一点,这个是先用i=0开始,执行完for下面的函数后,i的值还小于10,执行i++

i的值变为1

 

发表时间:2008-02-13 19:15:03 10 楼:myparadise

我想说的是,大家关心的应该是表达式的值。i++表达式的值是i加一前的值,++i是i加1后的值

发表时间:2008-04-07 16:03:07 11 楼:wuzh1230

大家有没有考虑返回值:l-value or r-value?

 

很有意思啊,可以想一想啊

网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|版权声明|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo