一、C语言
1 计算机程序
- 程序就是一组计算机能识别和执行的指令。
- 计算机的一切操作都是由程序控制的。
2 计算机语言
2.1 定义
人和计算机交流信息,要解决语言问题。需要创造一种计算机和人都能识别的语言,这就是计算机语言。
2.2 发展阶段
计算机语言经历了几个发展阶段:
- 机器语言
- 符号语言
- 高级语言
3 C语言的发展及其特点
3.1 概述
-
C语言是一门通用的计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
-
C语言是国际上广泛流行的计算机高级语言;C语言的祖先是BCPL语言。
-
最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的,后来逐步发展为一种高级编程语言,目前C语言使用的标准是1999年修正的C99。
3.2 特点
- 语言简洁、紧凑,使用方便、灵活
- 运算符丰富
- 数据类型丰富
- 具有结构化的控制语句
- 语法限制不太严格,程序设计自由度大
- C语言允许直接访问物理地址
- 用C语言编写的程序可移植性好
- 生成目标代码质量高,程序执行效率高
4 简单的C语言程序
- 一个程序由一个或多个源程序文件组成,在一个源程序文件中可以包括3个部分:① 预处理指令 ② 全局声明 ③ 函数定义
- 函数是C程序的主要组成部分:① 函数是C程序的基本单位。② 一个C语言程序是由一个或多个函数组成的,有且仅有一个
main
函数。③ 一个小程序只包含一个源程序文件。④ 函数既可以是库函数,也可以是用户自定义函数。 - 函数的两个部分:① 函数首部。函数首部包括函数名、函数类型、函数属性、函数参数(形式参数)名、参数类型。② 函数体。即函数首部下面的花括号内的部分。函数体一般包括两部分:声明部分和执行部分。
- 程序总是从
main
函数开始执行的 - 程序中对计算机的操作是由函数中的C语句完成的
- 在每个数据声明和语句的最后必须有一个分号
- C语言本身不提供输入输出语句
- 程序应当包含注释
5 运行C程序的步骤与方法
- 上机输人和编辑源程序。文件用.c作为后缀,生成源程序文件。
- 对源程序进行编译,先用C编译系统提供的“预处理器”(又称“预处理程序”或“预编译器”)对程序中的预处理指令进行编译预处理。 例如,对于
#include<stdio.h>
指令来说,就是将stdio.h
头文件的内容读进来,取代#include<stdio.h>
行。由预处理得到的信息与程序其他部分一起组成一个完整的、可以用来进行正式编译的源程序,然后由编译系统对该源程序进行编译。 - 编译的作用首先是对源程序进行检查,判定有无语法方面的错误,如有,则发出“出错信息”。修改程序后重新进行编译,如此反复进行,直到没有语法错误为止。这时,编译程序自动把源程序转换为二进制形式的目标程序(在Visual C++中后缀为.obj)。如果不特别指定,此目标程序一般也存放在用户当前目录下,此时源文件没有消失。
- 在用编译系统对源程序进行编译时,自动包括了预编译和正式编译两个阶段,一气呵成。用户不必分别发出二次指令。
- 进行连接处理。经过编译所得到的二进制目标文件(后缀为.obj)还不能供计算机直接执行。(一个程序可能包含若干个源程序文件,而编译是以源程序文件为对象的,一次编译只能得到与一个源程序文件相对应的目标文件(也称目标模块),它只是整个程序的一部分)必须把所有的编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体,生成一个可供计算机执行的目标程序,称为可执行程序(executive program),在 Visual C++中其后缀为.exe。
二、数据类型
char //字符数据类型 1
short //短整型 2
int //整型 4
long //长整型 4
long long //更长的整形 8
float //单精度浮点数 4
double //双精度浮点数 8
三、变量、常量
1 变量的分类
定义变量可能有3种情况:① 在函数的开头定义;② 在函数内的复合语句内定义;③ 在函数的外部定义。
-
局部变量:在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数以外是不能使用这些变量的。在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句内才能引用它们。在该复合语句以外是不能使用这些变量的,以上这些称为“局部变量”。
-
全局变量:程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
-
注意:在函数内定义的变量是局部变量,在函数外定义的变量是全局变量。
#include<stdio.h>
int global=2019; //全局变量
int main(){
int local=2018; //局部变量
int global=2020; //局部变量
printf("global=%d\n",global);
return 0;
}
当局部变量和全局变量同名的时候,局部变量优先使用。
2 变量的存储方式和生存期
2.1 静态存储和动态存储
数据分别存放在静态存储区和动态存储区中。
- 内存中供用户使用的存储空间可以分为3部分:① 程序区; ② 静态存储区;③ 动态存储区。
- 动态存储方式:动态存储方式则在程序运行期间根据需要进行动态的分配存储空间的方式。
- 静态存储方式:静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。
- 全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
- 在动态存储区中存放以下数据:① 函数形式参数。在调用函数时给形参分配存储空间。② 函数中定义的没有用关键字
static
声明的变量,即自动变量。③ 函数调用时的现场保护和返回地址等。
2.2 局部变量的存储类别
C的存储类别包括4种:自动的(auto
)、静态的(static
)、寄存器的(register
)、外部的(extern
)
-
① 自动变量(
auto
变量)
函数中的局部变量,如果不专门声明为static
(静态)存储类别,都是动态地分配存储空可的,数据存储在动态存储区中。函数中的形参和在函数中定义的局部变量(包括在复合语可中定义的局部变量),都属于此类。在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。自动变量用键字auto
作存储类别的声明。
实际上,关键字auto
可以省略,不写auto
则隐含指定为“自动存储类别”,它属于动态存储方式。程序中大多数变量属于自动变量。 -
② 静态局部变量(
static
局部变量)
希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值)。这时就应该指定该局部变量为“静态局部变量”,用关键字static
进行声明。 -
③ 寄存器变量(
register
变量)
一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。
为提高执行效率,允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量,用关键字register
作声明。
2.3 全局变量的存储类别
- ① 在一个文件内扩展外部变量的作用域
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。在定义点之前的函数不能引用该外部变量。如果由于某种考虑,在定义点之前的函数需要引用该外部变量,则应该在引用之前用关键字extern
对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置。有了此声明,就可以从“声明”处起,合法地使用该外部变量。 - ② 将外部变量的作用域扩展到其他文件