看C++primer的小收获

来源:互联网 发布:linux rpm位置 编辑:程序博客网 时间:2024/05/22 00:07
关于知识方面的就不讲,主要讲几点对大家都有用的 算是一种编程的习惯吧.
一. 前置操作与后置操作
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 )这样 如果你不小心漏掉了一个=号,编译器就会报错,提示 不能将一个变量赋给常量。
我一直以为我应该不会犯这种低级错误吧,这是给初学者用的,结果就是前天写代码的时候漏掉了一个=号,找了我半个多小时。。。
所以我强烈推荐大家(包括我自己),以后都要使用这种别扭的条件表达式if ( 5 == n)

还有很多,下次有空再写,嘿嘿 先吃饭去了。

原文地址:http://www.bcwhy.com/thread-1430-1-1.html

原创粉丝点击