1 const 和 #define定义常量的区别
1.1 define宏是编译预处理阶段展开,const常量是编译运行阶段使用
1.2 宏没有类型,不做任何类型的检查,仅仅是类型展开,const常量后要跟具体的类型,
在编译阶段会执行类型检查
1.3 define宏在多少地方使用,就展开多少次,不会分配内存,const常量会在内存中分配具体
的空间,这个空间可以是在堆中,也可以是在栈中
1.4 const定义的常量在内存中只会分配一次
2 宏定义了一段代码
2.1 在定义了宏以后,在进行宏替换时,应注意括号问题,以及运算符优先级的问题
3 预编译和编译
3.1 C语言由源代码生成的各阶段的步骤如下:
源代码 -> 编译预处理 -> 编译 -> 优化程序 -> 汇编程序 -> 连接程序 -> 可执行文件
3.2 预编译指令包括:#include, #define, #if, #else, #endif
3.3 编译预处理要进行的环节:宏替换,去注释,头文件展开,条件编译
3.4 #define定义的宏,可以多次使用
4 编译预处理
4.1 预处理命令行不能以分号结尾
4.2 预处理命令行可以出现在程序的最后一行
4.3 预处理命令行作用域是整个文件
5 多次定义宏
定义了宏之后,可以多次更改宏的值,每次更改之后宏之后下面的代码中有对应内容的
代码就会被替换,比如如下的代码,编译预处理阶段,会先把前两个a换成10,再把最后一
个a换成40
#define a 10
void foo();
void prin();
int main()
{
prin();
printf("%d ", a);
foo();
printf("%d ", a);
}
void foo()
{
#undef a
#define a 50
}
void prin()
{
printf("%d ", a);
}
6 ()
7 数组依靠输入得到字符串
7.1 数组要通过键盘输入获得一个含空格字符的字符串,不能通过scanf("%s", 字符数组名);
这是因为如果依靠循环给字符数组赋值,将会在空格处进行截断
7.2 可以使用如下代码给字符数组赋初值
char str[1001] = { 0 };
gets(str);