1.头文件的重复引用
如果在file1.c文件中include了两个头文件file2.h与file3.h,但是file2.h也include了file3.h,所以会重复引用file3.h。
为避免此情况,要使用#define进行保护,注意不要使用#pragma once
#ifndef FILE3_H
#define FILE3_H
// 省略
#endif
2.定义在函数内部的宏变量在外部仍是可见的。
3.bool变量在判断时候不要和true与false比较
// 此种写法更规范。
if (found) {
// code
}
4.截断
在c语言中进行变量赋值的时候,如果将字节多的数据类型赋给一个占字节少的变量类型
,会发生“截断”。发生这种情况的原因是:在赋值过程中只将占字节较长的变量的地位赋给占字节较少的变量。
比如把int类型存到char类型中,如下:
int main()
{
int a = 453;
char c;
c = a;
printf("%d\n", c);
return 0;
}
// 453→00000000 00000000 00000001 11000101
// 变为1字节 11000101→197
5.整型提升
就是在表达式计算时,将一些小整数类型转换成较大的整型类型。eg; bool、char、signed char、unsigned char、short和unsigned short只要能存在int里面都会提升为int类型,如果超了就提升为unsigned int类型。
整型的提升规则是:
1.若是有符号数,则前面位数补符号位。
2.若是无符号数,则前面8*3位补0。
这里面有问题就是:
如果某个运算符的运算对象类型不一致,这些运算对象将转换成同一类型。但如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个类型的相对大小了。
仍以上面为例子:
11001010进行整型提升,他是有符号位的
第一位1被认为符号位
提升后:1111111 1111111 11111111 11001010
转化为补码: 1000000 00000000 00000000 00111011 -> -59
6.图的DFS与BFS时间复杂度
两种遍历方法时间复杂度是相同的。
采用邻接矩阵存储结构,二者的时间复杂度为O(n²)
采用邻接表存储结构,二者时间复杂度为O(n+e),e为边数。
7. int存储
计算机存储的都是补码,正数的原码 反码 补码相同,负数的反码是原码除了符号位外,按位取反;补码是在反码的基础上+1。