一、使用const提高函数的健壮性
1.被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性
2.如果参数作输出用,不能加const修饰,否则该参数将失去输出功能。const只能修饰输入参数。
3. 如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
4.如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
5.如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
6.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
7.const修饰指针变量:
const修饰指针的值:const如果放在*的左边,修饰的是*p,表示指针指向的内容,是不能通过指针来改变的。但是指针变量本身(指针的指向)是可以修改的。
const int* p = #
*p = 20;//错误
p = &n;//正确
提示:const可以放在类型(int)左边,也可以放在右边。
const修饰指针:const如果放在*的右边,修饰的是p,表示指针变量(指针的指向)不能被改变。但是指针指向的内容,可以被改变。
int *const p = #
*p = 20;//正确
p = &n;//错误
当然const可以即修饰指针的值又修饰指针。这样的指针既不可以改变指向的变量,又不可以改变指向。
const int *const p = #
*p = 20;//错误
p = &n;//错误
二、使用assert断言
不满足条件时中断程序,并报错同时显示错误在源代码中的行号,便于程序员发现错误。
三、养成良好的编码风格
四、添加必要的注释
五、注意分辨操作符
当心那些视觉上不易分辨的操作符发生书写错误。我们经常会把“==”误写成“=”,象“|| ”、“&& ”、“<= ”、“>=”这类符号也很容易发生“丢 1 ”失误。然而编译器却不一定能自动指出这类错误
六、及时初始化
变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。
七、强制类型转换
当心自动类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让编译器轻悄悄地进行隐式的数据类型转换。
八、当心越界访问
当心变量发生上溢或下溢,数组的下标越界。
九、不要修补很差劲的代码
如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写
十、尽量使用库函数
尽量使用标准库函数,不要“发明”已经存在的库函数。
十一、提高程序的效率
1.先优化数据结构和算法,再优化执行代码。
2.有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷。例如多花费一些内存来提高性能。
3.不要追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。
十二、养成“使用调试器逐步跟踪程序”的习惯
1.调试快捷键:
F5:启动调试或直接跳到下一个断点处(在断点和断点间跳跃)
CTRL+F5:开始执行,不调试
F9:插入断点
F10:逐过程(不进入函数)
F11:逐语句(进入函数)
Shift+F11:跳出函数调用
2.插入断点:
a.条件断点:只有当满足一定条件时断点才起作用,用于在循环中插入断点。
b.在调试过程中可以随时在当前执行语句后插入断点以中断程序。
c.断点还可以用于跳过多次循环。
十三、杜绝”野指针“
补充内容:Debug和Release版本
1.Debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试。
2.Release称为发布版本,它往往是进行了各种优化,使得程序在大小和运行速度上都是最优的,以便用户很好的使用。不包含调试信息,不可以进行调试,assert不起作用。
补充内容:如何屏蔽警告(请慎用)
#pragma warning(disable:4996)
4996是对应报警的代码,可在输出窗口中查看
返回专栏目录https://blog.csdn.net/zty857016148/article/details/127068555