1.1 入门
一个C语言程序,无论大小如何,都是由函数和变量组成的。函数中包含一些语句,以指定所要执行的计算操作;变量则用于存储计算过程中使用的值。
函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值(称为参数)列表。
1.2 变量与算术表达式
输出格式说明表
%d |
按照十进制整型数打印 |
%6d |
按照十进制整型数打印,至少6个字符宽 |
%f |
按照浮点数打印 |
%6f |
按照浮点数打印,至少6个字符宽 |
%.2f |
按照浮点数打印,小数点后有两位小数 |
%6.2f |
按照浮点数打印,至少6个字符宽,小数点后有两位小数 |
%o |
按照八进制整型数打印 |
%x |
按照十六进制整型数打印 |
%c |
按照字符格式打印 |
%s |
按照字符串格式打印 |
%% |
表示百分号(%)本身 |
%u |
无符号常量 |
1.3 for语句
for语句是对while语句的推广。在实际编程过程中,可以选择while和for中任意一种循环语句,主要看使用哪一种更清晰。for语句比较适合初始化和增加步长都是单条语句并且逻辑相关的情形,因为它将循环控制语句放在一起,且比while语句更加紧凑。
1.4 符号常量
#define指令可以把符号名(符号常量)定义为一个特定的字符串,格式如下:
#define 名字 替换文本
替换文本可以是任何字符序列,而不仅限于数字。
注意:#define指令行末尾没有分号。
1.5 字符输入/输出
标准库的输入/输出都是按照字符流的方式处理。文本流是由多行字符构成的字符序列,而每行字符则由0个或多个字符组成,行末是一个换行符。
标准库提供了一次读/写一个字符的函数,其中最简单的是getchar和putchar函数。每次调用getchar时,从文本流中读入下一个输入字符,并将其作为结果值返回;每次调用putchar时,将打印一个字符。
注意,单引号中的字符表示一个整型值,该值等于此字符在机器字符集中对应的数值,我们称之为字符常量。但是,它只不过是小的整型数的另一种写法而已,比如,’A’是一个字符常量,在ASCII字符集中其值为65。
1.6 数组
数组下标可以是任何整型表达式,包括整型变量以及整型常量。
程序中经常使用下列方式表示多路判定:
if(条件1)
语句1
else if(条件2)
语句2
...
...
else
语句n
这种方式中,各条件从前往后依次求值,直到满足某个条件,然后执行对应的语句部分。第三章中将讨论的switch语句提供了编写多路分支程序的另一种方式,它特别适合于判定某个整型或字符表达式是否与一个常量集合中的某个元素相匹配的情况。
1.7 函数
函数定义的一般形式为:
返回值类型 函数名(0个或多个参数声明)
{
声明部分
语句序列
}
我们通常把函数定义中圆括号内列表中出现的变量称为形式参数,而把函数调用中与形式参数对应的值称为实际参数。
函数的返回值可通过return语句实现:return 表达式;
函数不一定都有返回值。不带表达式的return语句将把控制权返回给调用者,但不返回有用的值。main函数也可以向其调用者(程序的执行环境)返回一个值,一般来说,返回值为0表示正常终止,非0表示出现异常情况或出错结束条件。
1.8 参数——传值调用
在C语言中,所有函数参数都是“通过值”传递的。也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中。即,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。必要时,也可以让函数能够修改主调函数中的变量,这种情况下,调用者需要向被调用函数提供待设置值的变量的地址(指向变量的指针),而被调用函数则需要将对应的参数声明为指针类型,并通过它间接访问变量。
如果是数组参数,传递给函数的值是数组起始元素的位置或地址——它并不复制数组元素本身。在被调用函数中,可以通过数组下表访问或修改数组元素的值。
1.9 字符数组
在C语言中,若出现类似于”hello/0”的字符串常量时,它将以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,并把字符’/0’(即空字符,其值为0)插入到数组的末尾,以标记字符串的结束。
1.10 外部变量与作用域
函数中每个局部变量只在函数被调用时存在,在函数执行完毕退出时消失。这也是其他语言把这类变量称为自动变量的原因。以后我们使用“自动变量”代表“局部变量”。(第4章将讨论static存储类,这种类型的局部变量在多次函数调用之间保持值不变。)
由于自动变量只在函数调用执行期间存在,因此,在函数的两次调用之间,自动变量不保留前次调用的赋值,且在每次进入函数时都要显式为其赋值。如果自动变量没有赋值,则其中存放的是无效值。
还可以定义位于所有函数外部的变量,即在所有函数中都可以通过变量名访问这种类型的变量。由于外部变量可以在全局范围内访问,因此,函数间可以通过外部变量交换数据,而不必使用参数表。再者,外部变量在程序执行期间一直存在,而不是在函数调用时产生、在函数执行完毕时小时。即使在对外部变量赋值的函数返回后,这些变量仍将保持原来的值不变。
外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元。在每个需要访问外部变量的函数中,必须声明相应的外部变量,此时说明其类型。声明时,可以用extern语句显式声明,也可以根据上下文隐式声明。
在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没有必要使用extern声明。如果程序包含在多个源文件中,而某个变量在file1中定义,在file2和file3中使用,那么在file2和file3中就需要使用extern声明来建立该变量与其定义之间的联系。人们通常把变量和函数的extern声明放在一个单独的文件中(头文件),并在每个源文件的开头使用#include语句把所要用的头文件包含进来。
定义(define)与声明(declaration):“定义”表示创建变量或分配存储单元,而“声明”指的是说明变量的性质,但并不分配存储单元。
关于外部变量的深刻理解见附录1。(本分类的文章附录1 http://blog.csdn.net/jinjingwen/archive/2011/02/21/6197903.aspx)