C++Primer Warning and Notes

important:
3.3 : vector 对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素;

  1. 谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
  2. 范围for语句体内不应该改变其遍历序列的大小。
  3. 如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。
  4. 和内置类型的变量一样,如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未定义的值。
  5. 要想理解数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读。
  6. 大多数常见的安全问题都源于缓冲区溢出错误。当数组或其他类似数据结构的下标越界并试图访问非法内存区域时,就会产生此类错误。
  7. 一个指针如果指向了某种内置类型数组的尾元素的下一位置,则其具备于vector的end函数返回的与迭代器类似的功能。特别要注意,尾后指针不能执行解引用和递增操作。
  8. 内置的下标运算符所用的索引值不是无符号类型,这一点与vector和string不一样。
  9. 对大多数应用来说,使用标准库string要比使用风格字符串更安全、更高效。
  10. 尽量使用标准库类型而非数组.
  11. 要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。
  12. 拿不准时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求。
  13. 如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。当改变运算对象的子表达式的其他地方本身就是另外一个子表达式的运算对象时该规则无效,如*++iter
  14. 进行比较运算时除非比较的对象是布尔类型,否则不要使用布尔字面值true和false作为运算对象。
  15. 因为赋值运算符的优先级低于关系运算符的优先级,所以在条件语句中,赋值部分通常应该加上括号。
  16. 除非必须,否则不用递增递减运算符的后置版本。
  17. 随着条件嵌套层数的增加,代码的可读性急剧下降。因此,条件运算的嵌套最好别超过两到三层。
  18. 关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型。
  19. 避免强制类型转换。
  20. 使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的。
  21. 许多编辑器和开发环境都提供一种辅助工具,它可以自动地缩进代码以匹配其语结构。善用此类工具益处多多。
  22. 一般不要省略casse分支最后的break语。如果没写break语句,最好加一段注释说清楚程序的逻辑;
  23. 尽管switch语句不是非得在最后一个标签后面写上break,但是为了安全起见,最好这么做。因为这样的话,即使以后再增加新的case分支,也不用再前面补充break语句了。
  24. 即使不准备在default标签下做任何工作,定义一个default标签也是有用的。其目的在于告诉程序的读者,我们已经考虑到了默认的情况,只是目前什么也没做。
  25. 定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值