c++基础3:关于前置++和后置++的那么点纠结

STL基础6:list容器的使用总结曾经讨论过前置++和后置++最本质的区别:

前置++返回的就是操作数自增后的结果

int a=5;
int b=++a;//该表达式执行后b=6,a=6

后置++返回的是操作数的一个副本(未自增操作数的值),然而操作数本身已经调用前置++的方法自增

int a=5;
int b=a++;//该表达式执行后b=5,a=6

两者比较总结:

前置++的效率更高,后置++效率低(内部实现不仅拷贝了一份原始操作数的副本而且还调用了前置++进行操作数自增,然后返回元素操作数的副本)。所以如果不是特别需求的话就一律用前置++,保持这个习惯,当然,后置++也是有用武之地的,如下。

后置++的应用:

后置++操作符返回的是未加1的值,所以我们需要在单个复合表达式使用操作数自增前的原始值,然后在自增,那么就必须使用后置++。

例如1:依次删除lisDeleted1里的所有元素

for(List_Iter iter=lisDeleted1.begin();iter!=lisDeleted1.end();)  
{  
    lisDeleted1.erase(iter++);        
}


如果在for中使用lisDeleted1.erase(iter);iter++;这样的代码,那么迭代器iter在第一次使用erase删除后就会失效,然后使用失效的迭代器++就会造成程序报错,如果使用上面的一条复合表达式lisDeleted1.erase(iter++);这句话的解释是:erase删除的是iter++,也就是iter的副本,这句话执行完后然后iter本身其实已经在iter++的时候自增了,然后进行比较iter!=lisDeleted1.end(),所以这时候使用后置++

例如2:使用后置++将10个元素0--9添加到向量vector中

vector<int> ivec;
int cnt=0;
while(cnt<10)
{
	ivec.push_back(cnt++);
	/*ivec.push_back(cnt);
	cnt++;*/ //可以,麻烦
	//ivec.push_back(++cnt);//错,不行
}

如果这个时候使用前置++,ivec.push_back(++cnt);那么第一个元素0就不能添加到vector中,添加进去的是元素10,所以不能达到想要的效果

多个前置++相加和多个后置++相加又或者多个前置++和多个后置++混合相加的纠结:

如:

int a=5;
int b=(a++)+(a++)+(a++)+(a++)+(a++);
a=5;
b=(a++)+(++a)+(a++)+(++a)+(a++)+(++a);
a=1;
b=(++a)+(++a)+(++a)+(++a)+(++a)+(++a);

这些混合或者单个类型的相加,每个编译器相加的规则不一样,所以得到的值有可能出乎程序员能掌握的范畴。
克服这类副作用的方法是,尽量把程序写得易懂一些,即将费解处分解成若干个语句。如:k=i+++j:可写成k=i+j:i++:而类似(i++)+(i++)+(i++)这类连续自增、自减的运算最好不要使用,以避免疑团的出现,同时也可减少程序出错的可性能。在程序设计中,效率和易读性是一对主要矛盾。为了提高程序的效率,需要用技巧把程序写得尽可能简洁一些,但这样有可能降低程序的可读性和可理解性。可读性差的程序容易隐藏错误且难于纠正,不易维护,降低了程序的可靠性。鉴于“软件危机”的教训,人们在程序设计时遵守的基本规范是:可靠性第一,效率第二。为了保证可靠性,程序必须清晰易读,而表达式的清晰易读是十分重要的方面。因此,在C程序设计中,要慎重使用自增、自减运算符,特别是在一个表达式中不要多处出现变量的自增、自减等运算。

 

延伸,趣味话题:

你认为为什么c++不叫做++c???

"++"是c语言的自增操作符。c++是c语言的超集,是在c语言的基础上进行的扩展,所以是先有c语言,然后进行++的。根据自增操作符的前++和后++的区别,c++表示对c语言进行扩展之后,还是c的一个副本,还可以使用c语言的内容;而写成++c表示无法在使用c的原始值了,也就是说c++不能使用c了,这与实际情况不符合。

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值