关于C++中的“++”问题

   在C语言中,前++和后++总是让初学者搞不清方向,当然,当你了解了一些方法后,其实也就不难。昨天写代码又写到了++符(哪次没写到过?),想起了以前和一个朋友讨论++符问题的情景(他老骂我不搞点正经事,搞这种无聊的东西),觉得颇有意思,于是现在总结了一下能想到的所有关于++符的问题(不一定完全正确,还望指教)。

1)首先说一下关于如果分清前后++的问题(写给初学者)。
如果一个表达式里有前++或后++的话,如果来计算出表达式的值呢?如:
a = b ++;
我们可以把上面的一句语句拆成两个语句:
a = b;
b ++;
这两句话是等价的。而前++如何呢?如:
a = ++ b;
我们则可拆成:
++ b;
a = b;
这个方法很简单,前++就把++前移,后++就后移,然后就可知答案了。

2)++运算符做左值的问题。
比如有下面两个语句:
1. a ++ = b;
2. ++ a = b;
第一句话是错误的,我们可以这么理解,在重载后++运算符时,我们都会返回一个临时变量,比如这么写(假设A类里有个int型变量data):
int operator ++ (int)
{
 int temp = A.data;
 ++ A.data;
 return temp;
}
而临时变量是不可以做左值的。
第二句话当然是正确的,但也不完全正确,为什么呢?因为这是个为定义的值。我们不知道这个表达式结束后a的值到底是多少(这取决于不同的编译器,也就是我们不知道是先算“=”,还是先求“++”)。
写到这里,我突然想到了另一个有趣的语句,比如我们要将指针p指向的空间的值赋给指针q指向的空间,直到p所指的值为“0”时结束(假设一定会结束),我们可以这么写:
while (p)
{
 *q = *p;
 ++ p;
 ++ q;
}
上面的语句我们可以简单的写成:
while ( *q++ = *p++ );上面两段语句是等价的,咋看一下,怎么后++做左值了呢?其实这里并不是后++(临时变量)做左值,仔细分析下,就可明白是以临时变量为地址的内存空间做左值,这当然是合法的。

3)关于做循环变量时前后++的效率问题。
比如一个for循环,我们可能这样写
for ( int i=0; i<n; i++ ) { …… }
上面的语句中“i++”我们完全可以换成“++i”,这两个到底有没有区别呢?
我认为是有区别的,刚才第2条时我们就说道后++是返回了一个临时变量,那这个临时变量不就是个开销吗?通过重载前后++的函数比较,我们可以发现,前++是效率比较高的。所以,以后如果在语句中,前后++都可以时,建议用前++。

暂时就想到这么多,如有新发现,再追加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值