注:这只是站在笔笔自己的角度哦,(总结了部分要点)!
想要写好代码,首先必须有好的编写代码风格,试想,代码也是人与人交流的一种方式,在你面试时,如果写的代码杂乱无章,面试官还有心情看下去?(你的答卷肯定就去重生了)。写好的代码,就像做人一样,给人的印象要好,你愿意与生活杂乱无章的人成为亲故?
编写风格良好的代码
每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明–头文件(.h),
另一个文件用于保存程序的实现–定义(.c/.cpp)。
//风格良好
int width; // 宽度
int height; // 高度
int depth; // 深度
x = a + b;
y = c + d;
z = e + f;
if (width < height)
{
dosomething();
}
for (initialization; condition; update)
{
dosomething();
}
// 空行
other();
//风格不良,不要使用
int width, height, depth; // 宽度高度深度
x =a + b; y = c + d; z = e + f;
if (width < height) dosomething();
for (initialization; condition; update)
dosomething();
other();
注意(编写规则):
1. 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)
2. 应当将修饰符* 和 & 紧靠变量名,如char *str.
3. 程序中不要出现仅靠大小写区分的相似的标识符.
4. 类名和函数名用大写字母开头的单词组合而成(变量名小写)
5. 注意运算符的优先级
6. if语句与0的比较
7. 建议for语句的循环控制变量的取值采用“半开半闭区间”写法。
8. 每个case语句的结尾不要忘了加break,否则将导致多个分支重叠
这里讨论一下if语句与0值的比较
//a.布尔变量与零值比较
if(flag) //为真
if(!flag)//为假
//b.整型变量与零值比较
if (value == 0)
if (value != 0)
//c.浮点变量与零值比较
const float EPSINON = 0.00001; //设置精度
if ((x >= - EPSINON) && (x <= EPSINON)
//d.指针变量与零值比较
if (p == NULL)
if (p != NULL)
常量
可用const、enum.与#define定义常量。
比较前两者:
- const常量有数据类型,而宏常量没有数据类型。
- 宏常量不可调式,在程序预处理阶段进行宏替换,无类型安全检查。
- c++中使用const替代宏常量
枚举常量不会占用对象的存储空间,它们在编译时被全部求值.
函数设计
规则(简述):
- 参数命名应显而易见
- 若参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
- 使用断言捕捉不应该发生的非法情况
- 了解值传递,引用传递,指针传递的不同(之前的博客中说过哦!)
内存管理
内存分配如下:
常见的内存错误及其解决办法如下:
- 内存分配未成功,却使用了它(使用断言)
- 内存分配虽然成功,但是尚未初始化就引用它
- 内存分配成功并且已经初始化,但操作越过了内存的边界(越界)
- 使用完后,忘记释放,造成内存泄露(malloc与free,new与delete配对使用)
- 已经释放仍在使用(释放后设置为NULL,避免成为野指针)
注意:
指针消亡了,并不表示它所指的内存会被自动释放。
内存被释放了,并不表示指针会消亡或者成了NULL指针。
常见的内存考题;
//first
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:程序崩溃。
因为GetMemory并不能传递动态内存,
Test函数中的str一直都是NULL。
strcpy(str, "hello world");将使程序崩
溃。
//second
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
答:可能是乱码。
因为GetMemory返回的是指向“栈内存”
的指针,该指针的地址不是NULL,但其原
现的内容已经被清除,新内容不可知
//third
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
解答:
(1)能够输出hello
(2)内存泄漏
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
解答:
因为free(str);之后,str成为野指针,
if(str != NULL)语句不起作用
一定要注意,有还才有借!
最后给大家推荐一本刘同的书–《向着光亮那方》,个人感觉讲出了大多数大学生的心声,感觉在阅读自己的故事一样。