1.用#if 0 statements #endif可以注释代码好过/*
预处理指令
1.预处理指令包括#include,define。是由预处理器解释的,对其修改后把源代码交给编译器
2.如果你有一些声明需要用于几个不同的源文件,你在一个单一文件编写这些声明,便于维护
main函数
1.NUL是ascII字符集中'\0'字符的名字,字节模式全是0,NULL是指一个其值为0的指针
2.puts函数在标准输出并在末尾添加一个换行符
3.循环条件用整型而不是字符型,可以防止从输入读取字符的以外的解释为EOF,EOF是一个整型
rearrange函数
1.当数组名作为实参时,实际传递的是一个指向数组起始位置的指针
翻译
1.组成一个程序的每个源文件通过编译过程分别转换为目标代码,然后,各个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序
注释
1.注释被预处理器看作空格
整型家族
1.c标准只是规定长整型至少比整型长,整型至少比短整型长,但根据系统的差异不一定长
整型字面值
1.命名常量类型是const,初始化后值就不能改变
浮点数
1.浮点数没有统一的二进制表示形式
typedef
1.更适合用于函数指针和指向数组的指针
递归
1.阅读递归的最好方法不是追究他的过程,而是相信他会顺利完成任务,如果你每一个步骤正确无误,你的限制条件正确,并且每次调用都接近限制条件,那么递归总能顺利完成
1.int const 等价于 const int 常量
2.const变量 == 常量
3.const变量两种方法获得值,首先,声明时被初始化,其次,函数形参是const时在函数调用时获得实参值
代码块作用域
1.位于一对花括号的代码称为代码块。
2.如果内层代码块的与外层代码块的标识符同名,内层的标识符会隐藏外层的标识符
3.不同代码块的变量由于生存期不同,可能会共享同一内存地址
连接属性
1.链接属性有三种:external internal none,internal是指这个源文件中中所有声明都指向同一个实体,none每个实体都是单独的.extertnal在任何地方的声明都是一个实体
2.static只对缺省链接属性的extermal才能起到改变链接属性的效果
3.external链接属性的关键字第一次声明后,即使更改关键字也不会被修改链接属性
存储类型
1.有三个地方可以存储变量:普通内存,运行时堆栈,硬件寄存器
2.凡是在代码块之外声明的变量总是存储于静态内存中,不属于堆栈内存
3.对于在代码块内部声明的对象加上static关键字后,就变为静态变量
4.修改变量的存储类型并不代表修改他的作用域,它仍然只能在代码块内部访问,函数的形式参数不能声明为static,因为实参总是从堆栈传递给函数,支持递归
5.当他用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,但存储类型,作用域不受影响.在代码块内部用static关键字时,用于修改存储类型,但不改变链接属性和作用域,只被初始化一次,第二次初始化被无视
6.静态变量创建于程序执行之前,初始化在程序运行之时
7.全局变量总是静态类型,局部变量不具备链接属性
操作符
1.算术操作符只有%不能用于浮点数
2.左移操作符,左边移出界的丢失,右边补零。右移操作符:逻辑移位,左边移入0.算数移位:左边移入符号位,即全是1或全是0
3.移位的程序是不可移植的
4.sizeof(数组名)返回数组长度
5.++a不能进行赋值操作
6.逻辑操作符具有短路求值的特点
指针
1.未被初始化的指针,编译器报错
2.指针变量(包括静态指针变量)不会被初始化为NULL
3.无法预知变量在内存的具体位置,所以对变量地址赋值是不合法的做法
4.只有当两个指针指向同一个数组时,指针的减操作才有意义,值是两个指针的距离,以数组长度为单位而不是字节
5.关系运算也只对同一个数组的指针有效,尽量避免这类运算,因为程序不会有好的可移植性
递归
1.阅读递归函数的最好方法不是纠缠于他的执行过程,而是相信递归函数会顺利完成任务,你的限制条件设置正确,每次递归调用都接近限制条件,最终递归会顺利完成任务
2.追踪一个递归的关键是理解函数声明的变量是如何存储的
3.尾部递归可以很方便的转换成一个循环
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝