c++基础3:关于前置++和后置++的那么点纠结
2012-12-27 18:21
573 查看
在STL基础6:list容器的使用总结曾经讨论过前置++和后置++最本质的区别:
前置++返回的就是操作数自增后的结果
后置++返回的是操作数的一个副本(未自增操作数的值),然而操作数本身已经调用前置++的方法自增
两者比较总结:
前置++的效率更高,后置++效率低(内部实现不仅拷贝了一份原始操作数的副本而且还调用了前置++进行操作数自增,然后返回元素操作数的副本)。所以如果不是特别需求的话就一律用前置++,保持这个习惯,当然,后置++也是有用武之地的,如下。
后置++的应用:
后置++操作符返回的是未加1的值,所以我们需要在单个复合表达式使用操作数自增前的原始值,然后在自增,那么就必须使用后置++。
例如1:依次删除lisDeleted1里的所有元素
如果在for中使用lisDeleted1.erase(iter);iter++;这样的代码,那么迭代器iter在第一次使用erase删除后就会失效,然后使用失效的迭代器++就会造成程序报错,如果使用上面的一条复合表达式lisDeleted1.erase(iter++);这句话的解释是:erase删除的是iter++,也就是iter的副本,这句话执行完后然后iter本身其实已经在iter++的时候自增了,然后进行比较iter!=lisDeleted1.end(),所以这时候使用后置++
例如2:使用后置++将10个元素0--9添加到向量vector中
如果这个时候使用前置++,ivec.push_back(++cnt);那么第一个元素0就不能添加到vector中,添加进去的是元素10,所以不能达到想要的效果
多个前置++相加和多个后置++相加又或者多个前置++和多个后置++混合相加的纠结:
如:
这些混合或者单个类型的相加,每个编译器相加的规则不一样,所以得到的值有可能出乎程序员能掌握的范畴。
克服这类副作用的方法是,尽量把程序写得易懂一些,即将费解处分解成若干个语句。如: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了,这与实际情况不符合。
前置++返回的就是操作数自增后的结果
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了,这与实际情况不符合。
相关文章推荐
- 关于前置++和后置++的那么点纠结
- C++基础——关于模板的技巧性基础知识(typename、成员模板、模板的模板参数)
- 关于C/C++一些面试/笔试题的反思(超基础的知识点)
- C++中前置++与后置++运算符重载
- [C++基础]036_一段关于指针的误操作代码
- 【C++基础学习】关于C++静态数据成员
- 关于C/C++中的几个关键字(C基础)
- 关于printf打印前置++与后置++
- [C++STDlib基础]关于C标准输入输出的操作——C++标准库头文件<cstdio>
- C++再学习系列:前置++与后置++
- 关于C++程序设计的基础核心之二:继承与派生的基本知识
- c++关于类的基础学习
- 关于一道C++笔试题的纠结,学计算机的伤不起啊
- 关于理解c++面向对象基础
- [MFC学习之C++基础] 孙鑫视频中第三讲中提到的小测试程序(关于基类和子类的继承关系)
- c++ 前置++与后置++的区别
- C++ 关于类的那些基础事
- [C++基础]关于对象的创建及内存分配
- [转]C++ 关于类的那些基础事
- 设计模式关于C++的书为何那么少呢?