C和指针

1.#if ... #endif 之间的程序段就可以有效地从程序中去除,不管中间有没有注释

2.环境:两种环境不比位于同一台机器上

1.翻译环境:源代码被转换为可执行的机器指令

2.执行环境:用于实际执行代码

3.三字母词

4.注释会被预处理器拿掉,取而代之的是一个空格

5.printf("\40");输出空格 \40为八进制32

6.把一个大型程序放入一个单一的源文件中有什么优点,有什么缺点?

优点:链接时间会减少

缺点:(1)对文件的一点改动,都需要重新编译这个大文件;这时比分成几个小文件后,只重新编译有改动的文件的编译时间长。

(2)不易阅读。

(3)不易维护

7.长整型至少应该和整型一样长,整型至少应该和短整型一样长

8.在声明变量时,如果声明已经至少有了一个其他的说明符,关键字int可以省略

unsigned short int 与 unsigned short 一样

9.隐式声明:1.函数如果不显示地声明返回值的类型,它就默认返回整型(不建议)

10.原型作用域:只适用于函数原型中声明的参数名

11.函数作用域:只适用于标签,标签用于goto

12.如果摸个声明在正常情况下具有external链接属性,在它面前加上static关键字之后可以是它的连接属性变为internal。static只对缺省属性为external的声明才有效

13.extern 用于某标示符的第二次或以后的声明时,它并不会更改由第一次声明所指定的链接属性

14.凡是在任何代码块之外声明的变量总是存储于静态内存中,静态变量在程序运行之前创建

15.函数形式参数不能声明为静态的,因为实参总是在堆栈中传递给函数,用于支持递归

16.static作用域函数定义或代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。当用于代码块内部的变量的声明时,用于修改变量的存储类型,由自动变量修改为静态变量

17.函数---代码总是存储在静态内存中

18.switch(expression) expression必须是整型值

19.C不具备布尔类型,C不具备任何输入输出语句,I/O是通过调用库函数实现的;C也不具备任何异常处理语句,也是通过调用库函数完成的

20.右移位操作:逻辑移位(JAVA>>>)、算数移位(负数,取决于编译器JAVA>>)

21.while( (ch = getchar()) != EOF) ch为int型!!! 若为char型,将导致getchar返回值截断,而EOF为int型

22.判断表达式并不需要对表达式求值,所以sizeof(a=b+1)并没有向a赋任何值

23.++ -- 这些操作符的结果不是被他们所修改的变量,而是变量值的拷贝

++a = 10; 错误,++1的结果是a值的拷贝,不是变量本身,无法向一个值进行赋值

24.expression1, expression2, expression3 这些表达式自左向右进行求值,整个逗号表达式的值就是最后那个表达式的值

25.指针用->, 结构体本身用.

26.使用右值的地方可以使用左值,但需要左值的地方不能使用右值

27.声明一个指向整型的指针都不会“创建”用于存储整型值的内存空间

28.只有当两个指针指向同一个数组中的元素时,才允许从一个指针减去另一个指针,值为指针在内存中的距离(以数组元素的长度为单位)

29.标准允许指向数组的指针域指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元素之前的那个内存位置的指针进行比较

30.C预处理器在源代码编译之前对其进行一些文本性质的操作,主要包括:删除注释、插入被#include指令包含的文件的内容、定义,替换由#define指令定义的符号,确定代码的部分内容是否应该根据一些条件编译指令进行编译

31.宏 #define name(parameter-list) stuff (必须与name紧邻

32.宏参数和#define定义可以包含其他#define定义的符号,但,宏不可以出现递归

33.宏定义技巧:1.邻近字符串自动连接的特性是我们很容易把一个字符串分成几段

2.预处理器把一个宏参数转换为一个字符串: #argument 这种结果被预处理器翻译为“argument” 而 ##把位于两边的符号连接成一个符号

34.函数与宏:使用宏比使用函数在程序的规模和速度方面都更胜一筹

若宏太长,会导致程序的长度大幅增加

宏具有副作用

35.移除宏定义#undef

36.条件编译#if ... #end 如果条件值为非零值则正常编译否则预处理器就安静地删除它们 #if ... #elif ... #else ... #endif

37.编译器至少包含8层的头文件嵌套 消除重复包含使用#ifdef #endif

38.#error ... 允许你生产错误信息

39.当字符串常量出现在表达式中时它的值是个指针常量