看C++primer的小收获
2012-02-15 19:37
218 查看
关于知识方面的就不讲,主要讲几点对大家都有用的 算是一种编程的习惯吧.
一. 前置操作与后置操作
int i = 0, j;
j = ++i; // j = 1, i = 1;
j = i++; // j = 1, i = 2;
前置操作返回加1后的值,所以返回对象本身,这是左值。而后置操作返回的则是右值。
我们知道,前置操作需要做的工作要少,只需加1后返回加1后的结果即可。
而后置操作符则必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。
这也是C++为什么叫C++而不是++C的原因吧,呵呵。
对于int型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必操心性能差异的问题。
以上解释不是很懂?没关系,注意下面我所说的就可以。
我们在使用for做循环的时候 一般这么写for(i = 0; i < n; i++)
我希望大家以后都写成这样的for循环 for(i = 0; i < n; ++i)
也就是使用前置操作符,两者的运行结果是一样的,但是效率不同,上面有解释,所以建议使用后者(看了C++primer后我一直使用后者)。
还有值得注意的是:很多人做过这样的题 比如 m = (++n) +( n++) -( --n)甚至更复杂,总是得不到正确的结果,为什么?其实这个在不同编译器也许会有不同的结果。
所以,我们应该谨记:在一个表达式里,不要在两个或更多的子表达式中对同一对象做自增或者自减操作。因为此时结果不确定。就是垃圾代码!
二. if中的条件表达式
一般人都习惯这么写 if ( n == 5) {}
如果我们不小心写成了这样呢?if ( n = 5){} 此代码是合法的:将5赋给 n,然后检验赋值的结果。此时,5为非零值,因此为ture,执行if中的语句。但是我们的意愿是要比较n跟5是否相等,此时无论n值为多少,条件表达式恒为真,显然不是我们想要的,但是编译器还不会报错,导致很难找出错误所在。
可以用一个小技巧来避免这种情况的发生,那就是将常量表达式写在前面,if ( 5 =n )这样 如果你不小心漏掉了一个=号,编
4000
译器就会报错,提示 不能将一个变量赋给常量。
我一直以为我应该不会犯这种低级错误吧,这是给初学者用的,结果就是前天写代码的时候漏掉了一个=号,找了我半个多小时。。。
所以我强烈推荐大家(包括我自己),以后都要使用这种别扭的条件表达式if ( 5 == n)
还有很多,下次有空再写,嘿嘿 先吃饭去了。
原文地址:http://www.bcwhy.com/thread-1430-1-1.html
一. 前置操作与后置操作
int i = 0, j;
j = ++i; // j = 1, i = 1;
j = i++; // j = 1, i = 2;
前置操作返回加1后的值,所以返回对象本身,这是左值。而后置操作返回的则是右值。
我们知道,前置操作需要做的工作要少,只需加1后返回加1后的结果即可。
而后置操作符则必须先保存操作数原来的值,以便返回未加1之前的值作为操作的结果。
这也是C++为什么叫C++而不是++C的原因吧,呵呵。
对于int型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必操心性能差异的问题。
以上解释不是很懂?没关系,注意下面我所说的就可以。
我们在使用for做循环的时候 一般这么写for(i = 0; i < n; i++)
我希望大家以后都写成这样的for循环 for(i = 0; i < n; ++i)
也就是使用前置操作符,两者的运行结果是一样的,但是效率不同,上面有解释,所以建议使用后者(看了C++primer后我一直使用后者)。
还有值得注意的是:很多人做过这样的题 比如 m = (++n) +( n++) -( --n)甚至更复杂,总是得不到正确的结果,为什么?其实这个在不同编译器也许会有不同的结果。
所以,我们应该谨记:在一个表达式里,不要在两个或更多的子表达式中对同一对象做自增或者自减操作。因为此时结果不确定。就是垃圾代码!
二. if中的条件表达式
一般人都习惯这么写 if ( n == 5) {}
如果我们不小心写成了这样呢?if ( n = 5){} 此代码是合法的:将5赋给 n,然后检验赋值的结果。此时,5为非零值,因此为ture,执行if中的语句。但是我们的意愿是要比较n跟5是否相等,此时无论n值为多少,条件表达式恒为真,显然不是我们想要的,但是编译器还不会报错,导致很难找出错误所在。
可以用一个小技巧来避免这种情况的发生,那就是将常量表达式写在前面,if ( 5 =n )这样 如果你不小心漏掉了一个=号,编
4000
译器就会报错,提示 不能将一个变量赋给常量。
我一直以为我应该不会犯这种低级错误吧,这是给初学者用的,结果就是前天写代码的时候漏掉了一个=号,找了我半个多小时。。。
所以我强烈推荐大家(包括我自己),以后都要使用这种别扭的条件表达式if ( 5 == n)
还有很多,下次有空再写,嘿嘿 先吃饭去了。
原文地址:http://www.bcwhy.com/thread-1430-1-1.html
相关文章推荐
- 初学者:开始学C++,用的是C++primer这本书,今天的收获
- c++primer第六版第七章第七题问题总结
- java基础(二)------学习system类的几点收获(二)
- 看了韩立刚老师的录像课收获颇丰
- 一分耕耘 != 一分收获
- c++primer学习笔记3 - 数组和指针
- C++Primer (第四版) 重点笔记
- 一个码农6年技术成长经历的总结和收获
- 初学者:学习C++第三天,教材是C++primer
- C++primer初学者
- 八周 项目4 虽然不是自己的原文 而且也不大懂 但也有我的修改 有我的收获
- c++读书笔记, 零散点滴的收获
- C++Primer-虚函数与默认实参
- C++primer第9章习题解答
- C++primer U10 读书笔记 关联容器
- 【足迹C++primer】21、IO类
- 6月11日 学习收获
- 【足迹C++primer】34、泛型算法结构
- 痛并快乐着,有付出终会有收获——(程序员学习感言)
- 【足迹C++primer】46、动态存储类