程序的空白:空行将程序的不同部分分隔开来;制表符(tab)用于缩进语句。
注释:注释以符号/*开始,以符号*/结束;注释不能嵌套
从逻辑上删除一段代码:使用#if指令。
#if 0
statements
#endif
在#if和#endif之间的程序就可以有效地从程序中去除
如果一个程序中的源代码由几个源文件组成,那么使用该函数的源文件都必须写明该函数的原型。把原型放在头文件中并使用#include指令包含它们。
C函数的参数传递规则可以表示如下:所有传递给函数的参数都是按值传递的。
printf函数执行格式化的输出。printf函数接受多个参数,其中第一个参数是一个字符串,描述输出的格式;剩余的参数就是需要打印的值。
格式 | 含义 |
%d | 以十进制形式打印一个整型值 |
%o | 以八进制形式打印一个整型值 |
%x | 以十六进制形式打印一个整型值 |
%g | 打印一个浮点值 |
%c | 打印一个字符 |
%s | 打印一个字符串 |
\n | 换行 |
对于scanf函数的实现原理,所有标量参数的前面必须加上一个“&”符号,数组参数前面不需要加上“&”符号,但是数组参数如果出现了下标引用,即实际参数是数组的某个特定元素,那么它的前面也必须加上“&”符号。
使用所有格式代码(除了%c之外)时,输入值之前的空白(空格、制表符、换行符等)会被跳过,值后面的空白表示该值的结束。因此,用%s格式码输入字符串时,中间不能包含空白。
格式 | 含义 | 变量类型 |
%d | 读取一个整型值 | int |
%ld | 读取一个长整型值 | long |
%f | 读取一个实型值 | float |
%lf | 读取一个双精度实型值 | double |
%c | 读取一个字符 | char |
%s | 从输入中读取一个字符串 | char型数组 |
strcpy函数与strncpy函数类似,但它并没有限制需要复制的字符数量。它接受两个参数:第二个字符串参数将被复制到第一个字符串参数,第一个字符串原有的字符将被覆盖。
strcat函数也接受两个参数,但它把第二个参数添加到第一个字符串参数的末尾。
第二章:基本概念
在ANSI的任何一种实现中,存在两种不同的环境。
一种是:翻译环境。源代码被转换为可执行的机器指令;
另一种是:执行环境。用于实际执行代码。
编译过程:
(1)预处理器处理,预处理器在源代码上执行一些文本操作;
(2)源代码经过解析,判断它的语句意思。
三字母词:
??( [ | ??< { | ??= # |
??) ] | ??> } | ??/ \ |
??! | | ??' ^ | ??- ~ |
标识符:标识符就是变量、函数、类型的名字。由大小写字母、数字和下划线组成,但不能以数字开头。
第三章:数据
整型家族:包括字符、短整型、整型和长整型,分为有符号和无符号两大类。
长整型至少应该和整型一样长,而整型至少应该和短整型一样长。
指针常量:通过操作符获得一个变量的地址而不是直接把它的地址写成字面值常量的形式。
变量声明的基本形式是:说明符(一个或多个)声明表达式列表。
signed关键字一般只用于char类型。因为其他整型类型在缺省情况下都是有符号数
作用域:
(1)代码块作用域
当代码块处于嵌套状态时,声明与内层代码块的标识符的作用域到达该代码块的尾部便告终止;如果内层代码块有一个标识符的名字与外层代码块的一个标识符同名,内层的那个标识符就将隐藏外层的标识符,外层的那个标识符无法在内层代码块中通过名字访问。
(2)文件作用域
(3)原型作用域
只适用于函数原型中声明的参数名。
(4)函数作用域
只适用于语句标签,语句标签用于goto语句(一个函数中的所有语句标签必须唯一)
链接属性:
none(无):该标识符的多个声明被当做独立不同的实体;
internal(内部):标识符在同一个源文件内的所有声明中都指同一个实体;
external(外部):标识符不论声明多少次,位于几个源文件都表示同一个实体。
static关键字
当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响,用这种方
式声明的函数或变量只能在声明它们的源文件中访问。
当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但静态变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在。