笔记1

注:这只是站在笔笔自己的角度哦,(总结了部分要点)!
想要写好代码,首先必须有好的编写代码风格,试想,代码也是人与人交流的一种方式,在你面试时,如果写的代码杂乱无章,面试官还有心情看下去?(你的答卷肯定就去重生了)。写好的代码,就像做人一样,给人的印象要好,你愿意与生活杂乱无章的人成为亲故?

编写风格良好的代码

每个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)语句不起作用

一定要注意,有还才有借!

最后给大家推荐一本刘同的书–《向着光亮那方》,个人感觉讲出了大多数大学生的心声,感觉在阅读自己的故事一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值