在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,请大家详细讲讲!
参见《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; // 效率较高,不用返回一个临时对象。
对于这种较多数据的类,尽可能使用后置式。
More Effextive C++ 中文版
不适合我等初学者看的
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; // 效率较高......
那么请问谁的效率高?这个问题我没弄明白!
1楼的太有才了
think you
不过myobeject++这个后置式会产生临时对象,是++myobject这个前置式的效率高吧
结论应该是
大型数据类型操作是应该用前置的
搞的那么复杂 ++I,就是先加1,再取I的值
I++ ,先取I的值,再加1
随便它用在那个地方,这个都解释的通,它是表达试。
i++是i先参与运算再自加1
++i是i先自加1再参与运算
我是一个初学者,我对这个问题也有一些看法。
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的值。
小人之见,信者则信。不信者不信,
如有问题,望高人指点。谢谢。
我还是一个菜鸟:说一下,
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
我想说的是,大家关心的应该是表达式的值。i++表达式的值是i加一前的值,++i是i加1后的值
大家有没有考虑返回值:l-value or r-value?
很有意思啊,可以想一想啊
