@songying
2018-11-12T12:55:21.000000Z
字数 1783
阅读 1005
c语言
本篇博客所涉及的书籍有 《c 与指针》《c陷阱与缺陷》《c专家编程》
要从逻辑上删除一段c代码,更好的办法是使用(而非使用/* */) :
#if 0
//要删除的代码
#endif
小技巧
**如果你有一些声明需要用于几个不同的源文件,你可以在单独的文件中编写这些声明,然后#include指令将这个文件包含到这些声明的源文件中 **
#include <stduio.h>
#define MAX_COL 10
#define MIN_COL 1
你可以将这些类似的声明放入到#include 文件中
小技巧
如果某个程序的源代码由几个源文件组成,那么使用该函数的源文件都必须写明该函数的原型,并将原型放在头文件中并使用#include 指令包含它们,这样可以避免由于同一个声明的多份拷贝而导致的维护性问题。
让你的代码结构更清晰
int n_columns; /* 进行处理的行号 */
char some_char; /* 你声明了一个char类型 */
float some_float; /* 你声明了一个float类型 */
double some_double; /* 你声明了一个double类型 */
一个小注意
c语言中所有参数的传递都是按值传递的。即使是指针,其传递的也是指针的值,而非指针所指的值
**关于注释你必须知道的事 **
你必须时刻注意书写正确的注释(不要在注释里骂老板或跟妹子表白),并且在你修改代码的时候,你一定要注意注释的更新。
**少年,你要知道: 如果注释不正确,那还不如没有注释 **
NULL与NUL
NUL是 `\0`字符的名字,它的字节模式为全0,并不存在预定义的NUL,所以如果你想使用它而不是字符常量`0`,你必须自己定义.
**NUL作为字符串终止符,它本身并不被看作是字符串的一部分 **
NULL是指一个其值为0的指针,其在头文件
studio.h
中定义。**NULL与NUL都是整型值,其值也相同,所以它们可以互换使用,但你一定要在正确的场合使用正确的字符 **
小提示
标准并未硬性规定编译器必须对数组的下表进行有效性检查,所以,你不许对数组下表进行检查
小注意
当数组名作为实参时,传给函数的实际是一个只想数组起始位置的指针,也就是数组在内存中的地址。
程序的启动流程
**翻译: ** 就是将程序转化为可执行程序的过程。
执行: 程序必须载入到内存中。
在宿主环境中,该过程由操作系统完成,那些不是存储在堆栈中的尚未初始化的变量也在这个时候得到初始化。
在独立环境中,程序的载入必须手工安排,也可能是通过把可执行代码写入到只读内存来完成。
程序执行开始,启动程序+main
执行程序代码时,程序将使用一个运行时堆栈,它用于存储函数的局部辩论和返回地址。
程序同时也可以使用静态内存存储静态内存中的变量。
**程序终止:**main返回或程序错误
代码风格
- 空格用于分隔不同的逻辑代码段,他们是按照功能分段的。
- if语句和函数原型中,在括号和表达式中留下一个空格。
小提示
在一个把字符当作小整型值的程序中,若显示地把这类变量声明为signed与unsigned,可提高这类程序的可移植性。
小提示
缺省的char要么是signed char ,要么是 unsigned char,这依据编译器而定。
因此,将cahr型变量的值限制在signed char 和 unsigned char的交集内,这可获得最大的可移植性,同时又不牺牲效率。
并且,只有当char变量显示声明为signed或unsigned时,才对它进行算数运算。
整型字面值常量
在整型字面值后面添加字符L或l,可以使这个整数被解释为long整型值, 添加字符U或u用于把字面值指定为unsigned整型值。
整数数值前面以0开头,表示八进制。以0x开头,表示十六进制。
字符常量
字符常量的类型总是int型,你不能在它们后面添加unsigned 或 long 后缀。
如果一个字符常量的前面有一个L, 那么它就是宽字符常量: L'x'
枚举类型
枚举类型中的值是符号常量而非字面值常量,其以整型方式存储,这些符号名的实际值都是整型值。
enum Jar_Type{ CUP, PINT, QUART};
浮点数字面值
浮点数字面值总是十进制形式,它必须有一个小数点或一个指数,或两者都有。
浮点数字面值在缺省时都是double型,除非它的后面跟一个L或l表示是一个long double类型, 或跟一个F或f表示是一个float类型的值。