1 C语言基础
1.1 关键字
在C语言中,关键字是指被赋予特定意义的一些单词,不能把这些单词作为标识符来使用.C语言一共有32个关键字,如下图。在后面的学习中会逐渐接触到这些关键字的具体使用用法。
1.2 标识符
标识符可以简单的理解为一个名字,用来标识变量名、常量名、函数名以及数组名等。在C语言中,标识符可以设定容易理解的名字,但要遵循一定的规则。具体规则如下:
1、所有标识符都必须以字母或下划线开头,不能以数字或符号开头。
2、在设定标识符时,除了开头外,其他位置可以由字母、下划线、数字组成。
3、区分大小写。
4、标识符不能是关键字。关键字是定义一种类型所使用的特殊字符,不能使用关键字作为标识符。
5、标识符的命名最好具有相关的含义,即见名知义。
6、ANSI标准规定,标识符可以是任意长度,但外部名必须至少能由前六个字符唯一的区分,并且不区分大小写。
1.3 数据类型
C语言中有多种不同的数据类型,包括基本数据类型、构造类型、指针类型和空类型等,下图是C语言数据类型的组织结构,再对每种数据类型进行相应的讲解。
1.3.1 基本数据类型
基本数据类型,包括整型、字符型、实型(浮点型)和枚举类型。例如:
1.3.2 构造类型
构造类型就是使用基本数据类型的数据,或者使用已经构造好的数据类型,通过添加、设计、构造出新的数据类型,使设计的新构造类型满足待解决问题所需要的数据类型。
通过构造类型的说明可以看出,它并不像基本数据类型那样简单,而是由多种类型组合而成的新类型,其中的每个组成部分称为构造类型的成员。构造类型包括数据类型、构造体类型和共用体类型3种。例如:
1.3.3 指针类型
指针类型不同于其他类型,其特殊性就在于指针的值表示的是某个内存地址。例如:
int *p //指针类型
1.3.4 空类型
空类型的关键字是void,其主要的作用包括两点:
1、对函数返回值的限定。
2、对函数参数的限定。
也就是说,一般一个函数都具有一个返回值,将其返回给调用者。这个返回值应该具有特定的类型,如整型。但是,当函数不必返回一个值时,就可以使用空类型设定返回值的类型。例如:
1.4 常量
常量就是其值在程序运行过程中不可以改变的数值。所有的常量分为三大类。
1、数值型常量:整型常量和实型常量。
2、字符型常量。
3、符号常量。
1.4.1 整型常量
整型常量是指直接使用的整型常数,如0、-100、20等。整型常量可以分为长整型、短整型、符号整型和无符号整型。
在编写整型常量时,可以在常量的后面加上符号L或U进行修饰。L表示长整型,U表示无符号整型。
1.4.2 实型常量(浮点型常量)
实型常量是由整数部分和小数部分组成。表示实型常量的有两种方式:
1、小数表示法
小数表示法就是使用十进制的小数方法描述实型常量,如:
2、指数表示
有时实型常量非常大或非常小,使用小数表示不利于观察,这时就可以使用指数显示,其中,使用字母e或E进行指数显示。例如:
在编写实型常量时,可以在常量的后面加上符号F或L进行修饰,其中F表示单精度类型,L表示双精度类型。例如:
注意:如果不在常量的后面加上后缀,默认实型常量为双精度类型
1.4.3 字符型常量
字符常量与前面介绍的常量不同,即要对字符型常量使用指定的定界符进行限制。字符型常量有两种:字符常量和字符串常量。
1、字符常量
字符常量是使用一对英文单引号括起来的一个字符。例如'A','b','1'等都是正确的字符常量。
注意:
(1)字符常量中只能包含一个字符。
(2)字符常量区分大小写。
(3)这对单引号是定界符,不属于字符串常量中的一部分。
2、字符串常量
字符串常量使用一对双引号括起来的若干字符序列。如果在一个字符串中一个字符都没有,则将其称为空字符串,此时字符串长度是 0。例如:""。在C语言中存储字符串常量时,系统会在字符串常量的末尾自动加上一个"\0"作为字符串常量结束标志。例如,字符串常量"welcome"在内存中的存储形式如下图所示:
注意:在程序编写字符串常量时,不用在字符串常量的末尾加上"\0"结束字符,系统会自动添加。
1.4.4 转义字符
转义字符在字符常量中是一种特殊的字符,转义字符是以反斜杠"\"开头的字符,后面跟一个或多个字符。常用的转移字符及其含义如下表:
1.4.5 符号常量
使用一个符号代替固定的常量值,就是符号常量。例如下面代码中的PAI就是一个符号常量。
#include <stdio.h>
#define PAI 3.14
int main(){
double fRadius;//半径变量
double fResult = 0;//结果变量
printf("请输入圆的半径:");
scanf("%lf",&fRadius);
fResult = fRadius * fRadius * PAI;
printf("圆的面积是:%lf\n",fResult);
return 0;
}
运行结果是:
1.5 变量
变量就是在程序运行期间其值可以变化的。每个变量都有一种类型,每种类型都定义了变量的格式和行为。数据各式各样,要先根据数据的类型为它申请一块合适的空间。C语言中的变量类型有整数变量、实型变量和字符型变量。
1.5.1 整型变量
整型变量是用来存储整型数值的变量。整型变量可以分为6种类型,如下图所示:
说明:[]为可选部分。
下图列出整型变量的长度和取值方位范围:
注意:在编写程序时,定义所有变量的步骤应该在变量的赋值之前,否则会报错。通过下面两段代码进行对比。
1.5.2 实型变量
实型变量也称为浮点型变量,由整数和小数部分组成。在C语言中,实型变量根据实型的精度还可以分为单精度、双精度和长双精度三种类型。如下:
1、单精度类型
定义单精度类型变量所使用的关键字是float,它在内存中占4个字节。使用如下:
注意:在为单精度类型变量赋值时,需要在数值后面加f,表示该数值的类型是单精度,否则默认是双精度类型。
2、双精度类型
定义双精度类型的所使用的关键字是double,它在内存中占8个字节,使用如下:
1.5.3 字符型变量
字符型变量是用来存储字符常量的变量。把一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。字符型变量在内存中占1个字节,取值范围-128~127。定义一个字符型变量的方法是使用关键字char。使用如下:
说明:字符数据在内存中存储的是ASCII码值,即一个无符号整数,其存储形式与整数的存储形式一样,因此,C语言允许字符型数据与整型数据之间通用。例如:
以上介绍了整型变量、实型变量和字符型变量,三种类型变量所使用的关键字、占用字节和取值范围如下:
1.6 变量的存储类别
在C语言中可以选择变量的不同存储形式,可以分为静态存储和动态存储。静态存储是指在程序运行期间分配固定的存储空间,而动态存储是指程序运行期间根据需要动态的分配存储空间。可以通过存储形式来告诉编译器要处理什么类型的变量,主要有自动(auto)、静态(static)、寄存器(register)、外部(extern)4中变量。
1.6.1 auto变量
auto关键字用来修饰一个局部变量为自动的,每次执行到定义该变量的代码时,都会产生一个新的变量,并且对这个变量重新进行初始化。
例如下面代码,在AddOne()函数中定义一个auto型的整型变量iInt,在其中对变量进行加1操作。之后在主函数main()中通过显示的提示语句,可以看到调用了两次AddOne()函数的输出。从结果中可以看到,在AddOne()函数中定义整型变量时系统会为其分配存储空间,在函数调用结束时自动释放这些存储空间。
#include <stdio.h>
void AddOne(){
auto int iInt = 1;
iInt = iInt + 1;
printf("%d\n",iInt);
}
int main(){
printf("第一次调用:");
AddOne();
printf("第二次调用:");
AddOne();
return 0;
}
运行结果如下:
注意: 关键字auto是可以省略的。如果不特别指定,那么局部变量的存储方式默认为自动的。
1.6.2 static变量
static变量为静态变量,将函数的内部和外部变量声明为static变量的意义是不一样的。不过对于局部变量来说,两者的作用域都是仅限于声明变量的函数中,但在语句执行期间,static变量将始终保持它的值,并且初始化操作只在第一次执行时起作用。在随后的运行过程中,变量将保持语句块上一次执行时的值。
#include <stdio.h>
void AddOne(){
static int iInt = 1;
iInt = iInt + 1;
printf("%d\n",iInt);
}
int main(){
printf("第一次调用:");
AddOne();
printf("第二次调用:");
AddOne();
return 0;
}
1.6.3 register变量
register变量称为寄存器存储类变量。使用register变量的目的在于让程序员把指定的某个局部变量存放在计算机的某个硬件寄存器中,而不是存放在内存中。这样做的好处是以提高程序的运行速度。用户无法获取寄存器变量的地址,因为绝大多数计算机的硬件寄存器都不占用内存地址。而且,即使编译器忽略register而把变量存放在可设定的内存中中,也是无法获取变量的地址的。
例如,使用register变量修饰整型变量,代码如下:
#include <stdio.h>
int main(){
register int iInt;
iInt = 100;
printf("%d\n",iInt);
return 0;
}
1.6.4 extern变量
extern变量称为外部存储变量。extern声明了程序中将要用到但尚未定义的外部变量。通常,外部存储类都用于声明在另一个转换单元中定义的变量。一个工程是由多个C源文件组成的。这些源文件分别编译,然后链接成一个可执行模块。把这样的一个程序作为一个工程进行管理,并且生成一个工程文件来记录所包含的所有源文件。
例如,创建 两个C源文件Extern1.c和Extern2.c,现在Extern1.c文件中定义了一个iExtern变量,并为其赋值;然后在Extern2.c文件中使用iExtern变量,并将其变量值显示到控制台。