一、学习C语言前需要了解的常识
1.什么是计算机?
计算机(computer)俗称电脑,是一种可以进行数值运算又可以进行逻辑运算的高速计算的电子计算机器。目前公认世界上第一台电子计算机是1946年在美国宾夕法尼亚大学诞生的ENIAC(Electronic Numerical Integrator And Calculator)。
2.计算机的组成
计算机由硬件系统和软件系统组成。
硬件系统主要由五部分构成:运算器、控制器、存储器、I/O设备(输入设备和输出设备)。CPU(Central Processing Unit),又称中央处理器,主要由运算器,控制器,寄存器构成。CPU是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。现代计算机中CPU均采用冯诺依曼体系结构,在该体系结构下,程序和数据统一存储,指令和数据需要从同一存储空间存取,经由同一总线传输,无法重叠执行。
软件系统主要分为系统软件和应用软件。系统软件一般包括操作系统、语言处理程序、数据库系统和网络管理系统。应用软件一般分为两类,一类是为特定需要开发的实用型软件,另一类是为了方便用户使用计算机而提供的一种工具软件。
3.什么是计算机程序?
计算机程序是一组计算机能识别和执行的指令集。通俗的来讲就是人们通过计算机语言告诉计算机想要它做什么事,解决什么问题,如何工作等,每做一件事就是一条指令,而一条或多条指令的集合我们就称之为一个计算机程序。
指令:可以被计算机理解并执行的基本操作指令。
程序:一组计算机能识别和执行的指令。一个特定的指令序列用来完成一定的功能。
软件:与计算机系统操作有关的计算机程序、规程、规划,以及可能有的文件、文档及数据。
4.什么是计算机语言?
计算机语言是一种人工设计的语言,用于人与计算机之间的信息交流。计算机语言主要分为机器语言、汇编语言和高级语言。
机器语言:计算机能直接识别和接受的二进制代码称为机器指令。机器指令的集合就是该计算机的机器语言。
特点:难学,难记,难检查,难修改,难以推广使用。依赖具体机器难以移植。
B8 7F 01
BB 21 02
03 D8
B8 1F 04
2B C3
汇编语言:机器语言的符号化。用英文字母和数字表示指令的符号语言。
特点:相比机器语言简单好记,但仍然难以普及。汇编指令需通过汇编程序转换为机器指令才能被计算机执行。依赖具体机器难以移植。
MOV AX 383
MOV BX 545
ADD BX AX
MOV AX 1055
SUB AX BX
高级语言:更接近于人们习惯使用的自然语言和数学语言。
特点:功能强大,不依赖于具体机器。用高级语言编写的源程序需要通过编译程序转换为机器指令的目标程序。
S=1055-(383+545)
高级语言的发展,由最原先的非结构化,再到结构化,再到目前面向对象的语言。在发展到结构化语言时就已规定程序必须由具有良好特性的基本结构(顺序结构、选择结构、循环结构)构成,程序中的流程不允许随意跳转,程序总是由上而下顺序执行各个基本结构。这样编写出来的程序结构清晰,易于编写、阅读和维护。
5.什么是C语言?
C语言是一门通用计算机高级语言,被广泛应用于底层开发,是1972-1973年间由D.M.Ritchie在B语言的基础上设计出了C语言。最初的C语言只是为了描述和实现UNIX操作系统提供一种工作语言而设计的。随着UNIX的日益广泛使用,C语言也迅速得到推广。1978年以后,C语言先后移植到大、中、小和微型计算机上。C语言便很快风靡全世界,成为世界上应用最广泛的程序设计高级语言。
C语言具有以下特点:
1.语言简洁、紧凑、使用方便、灵活。
2.运算符丰富。
3.数据类型丰富。
4.有结构化的控制语句(用函数作为程序的模块单位,便于实现程序的模块化,而C语言是完全模块化和结构化的语言)。
5.语法限制不太严格,程序设计自由度大。
6.允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作(因此C语言既具有高级语言的功能,又具有低级语言的许多功能,可用来编写系统软件)。
7.程序可移植性好。
8.生成目标代码质量高,程序执行效率高。
二、C语言程序
1.如何新建一个C语言项目
还未撰写。
2.如何创建一个C语言文件
还未撰写。
3.C语言程序的构成
C 程序主要包括以下部分:
- 预处理指令
- 函数
- 变量
- 语句&表达式
- 注释
下面来看最简单的C语言程序
要求:在屏幕上输出:This is a C program.
#include <stdio.h> //这是编译器预处理指令
int main() //定义主函数
{ //函数开始的标志
printf("This is a C program.\n"); //输出所指定的一行信息
return 0; //函数执行完毕时返回函数值0
} //函数结束的标志
运行结果
程序分析:
在使用函数库中的输入输出函数时,编译系统要求程序提供有关此函数的信息,程序第1行“#include <stdio.h>”的作用就是用来提供这些信息的。stdio.h是系统提供的一个文件名,stdio是standard input & output的缩写,文件后缀.h的意思是头文件(header file),因为这些文件都是放在程序各文件模块的开头的。输入输出函数的相关信息已事先放在stdio.h文件中。
main是函数的名字,表示“主函数”。每一个C语言程序都必须有一个main函数。main前面的int表示此函数的类型是int类型(整形),即在执行主函数后会得到一个值(即函数值),其值为整形。return 0;的作用是当main函数执行结束前将整数0作为函数值,返回到函数调用处。而函数体由花括号{}括起来。
printf是C编译系统提供的函数库中的输出函数。printf函数中双引号内的字符串″This is a C program.″按原样输出。\n是换行符,即在输出″This is a C program.″后,显示屏上的光标位置移到下一行的开头。 每个语句最后都有一个分号,表示语句结束。
//表示从此处到本行结束是“注释”,用来对程序有关部分进行必要的说明。在写C程序时应当多用注释,以方便自己和别人理解程序各部分的作用。在程序进行预编译处理时将每个注释替换为一个空格,因此在编译时注释部分不产生目标代码,注释对运行不起作用。注释只是给人看的,而不是让计算机执行的。
4.注释
由上一个程序可以看出,程序在编译运行时,代码中所有注释的内容都会被编译器跳过,不会被编译器执行。那什么是注释呢?注释是在所有计算机语言中都非常重要的一个部分,通俗来讲就是注解、解释的意思,注释可以是任何符号文字,它可以被用在某一段或者某一行代码用来解释其含义,方便程序后期的维护,提高程序的可读性。因此,一个程序员必须要具备勤写注释的良好习惯。
注释一共分为两种,单行注释(// )和多行注释(/* */)。
以//开始的是单行注释。这种注释可以单独占一行,也可以出现在一行中其他内容的右侧。此种注释的范围从//开始,以换行符结束。如果注释内容一行内写不下,可以用多个单行注释。
以/*开始,以*/结束的块式注释是多行注释。这种注释可以包含多行内容。它可以单独占一行(在行开头以/*开始,行末以*/结束),也可以包含多行。编译系统在发现一个/*后,会开始找注释结束符*/,把二者间的内容作为注释。
注意:在字符串中的//和/*都不作为注释的开始。而是作为字符串的一部分。
#include <stdio.h>
int main()
{
printf("//Hello World!//\n\n");
printf("/*How are you?*/");
return 0;
}
运行结果:
三、关键字和标识符
1.什么是关键字?
C语言关键字(Keywords)是C语言编程语言中预先定义并保留的标识符,它们具有特定的含义,并用于构成C语言程序的基本结构和功能。在开发工具中,这些关键字会显示出与其他代码不一样的颜色。关键字不能用作变量名、函数名或其他标识符的名称。请注意,关键字是区分大小写的,并且通常以小写字母开头(除了_Bo01,它可以是Bo01或bo01)。在编写C语言程序时,应避免使用这些关键字作为标识符的名称。
2.关键字的分类(32个)
数字类型关键字:用于声明变量的数据类型。
类型 | 关键字 | 用途 |
---|---|---|
基本数据类型关键字 | char | 定义字符型类型变量 |
int | 定义整型类型变量 | |
float | 定义浮点型类型变量(单精度) | |
double | 定义浮点型类型变量(双精度) | |
类型修饰关键字 | short | 修饰int,声明短整型类型数据,可省略被修饰的int |
long | 修饰int,声明长整型类型数据,可以省略被修饰的int | |
signed | 修饰整形类型数据,声明有符号数据类型 | |
unsigned | 修饰整形类型数据,声明无符号数据类型 | |
复杂类型关键字 | struct | 结构声明体 |
union | 共用声明体 | |
enmu | 枚举声明 |
控制语句关键字:用于控制程序的流程。
类型 | 关键字 | 用途 |
---|---|---|
分支结构 |
if | if条件语句 |
else | 条件语句否定分支(与if配合使用) | |
switch | 开关语句(与case、default配合使用) | |
case | 开关语句中的分支标记 | |
default | 开关语句中的“其他”分支 | |
循环结构 |
for | for循环语句 |
while | while循环语句 | |
do | do……while循环语句 | |
跳转结构 |
continue | 跳过语句(配合循环结构使用) |
break | 跳出语句(配合循环结构以及switch使用) | |
goto(不常用) | 无条件跳转语句 | |
return | 返回语句,用于返回特定值 |
存储类型关键字:用于定义变量的存储类别。
关键字 | 用途 |
---|---|
auto | 指定为自动变量 |
register | 指定为寄存器变量 |
static | 指定为静态变量 |
extern | 指定对应变量为外部变量 |
const | 指定变量为只读变量 |
volatile | 指定变量为易变变量 |
特殊用途关键字:具有特殊用途的关键字。
关键字 | 用途 |
---|---|
void | 空类型(不能定义变量,修饰函数的参数或返回值,表示没有) |
sizeof | 计算数据类型长度 |
typedef | 声明类型别名 |
3.什么是标识符?
C语言中的标识符(ldentifier)是用于命名变量、函数、类型、标签和其他用户定义项的名称。通俗的来讲就是方便程序员区分程序中的众多函数,给这些不同的函数起了不同的名称,这些名称就是标识符。这些标识符在C语言中是由程序员自行选择的,但必须遵循一些基本规则,以便编译器能够正确解析它们。
标识符的命名规则:
一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Manpower 和 manpower 是两个不同的标识符。C语言的标识符命名规则可以总结为以下几点。
1.只能由数字、字母、下划线组成。
2.不能以数字开头。
3.不能使用C语言的关键字。
4.好的命名习惯要做到见名知义
(1)大驼峰命名法:每个单词首字母大写。例如:MyFirstName
(2)小驼峰命名法:从第二个单词开始,首字母大写。例如:myFirstName
(3)下划线命名法:每个单词之间用_连接。例如:my_first_name
以下列出一些标识符:
_name(合法)、1name(不合法)、Adress(合法)、MyName(合法)、last-test(不合法)、first#test(不合法)、final_test(合法)
四、数据类型
1.字节和地址
在了解C语言的数据类型之前,需要先了解什么是计算机的字节和地址。
- 位(bit):简写为“b”,读作比特,是计算机中最小的数据单位,使用二进制,只能表示0和1。
- 字节(Byte):又称字节单元或字节存储单元,是计算机信息中用于描述存储容量和传输容量的一种计量单位,是计算机技术中最小的可操作存储单位。一个字节由8位组成,从0000 0000到1111 1111,表示0~255之间的数字,也可以表示单个字符。计算机访问内存的基本单位是字节。
名称 | 简写 | 换算 |
---|---|---|
字节 | B | 1B=8b(bit) |
千字节 | KB | 1KB=2^10B=1024B |
兆字节 | MB | 1MB=2^10KB=1024KB |
吉字节 | GB | 1GB=2^10MB=1024MB |
太字节 | TB | 1TB=2^10GB=1024GB |
拍字节 | PB | 1PB=2^10TB=1024TB |
…… | …… | …… |
- 地址:为了有效地使用内存,将内存划分为一个个小的内存单元,每个内存单元的大小是一个字节。为了能够快速有效地访问每个内存单元,就给这些内存单元进行了编号,这些编号就叫做该内存单元的地址。
- 地址编号:在32位平台下,内存单元的地址是由32位的二进制数(即8位十六进制数)依次编号。所以内存单元共有2^32个,而每一个内存单元保存1个字节的内容。
2.C语言数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。通俗来说一个C程序在内存中运行过程中会产生各种各样的临时数据,为了方便数据的运算和操作,C语言对这些数据进行了分类,提供了丰富的数据类型。
C语言的数据类型一共分为四大类:基本数据类型、枚举类型、空类型、派生类型。
类型 | 描述 |
---|---|
基本数据类型 | 它们是算术类型,包括整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。 |
枚举类型 | 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
空类型 | 也称为void类型。表示没有值的数据类型,通常用于函数返回值。 |
派生类型 | 包括数组类型、指针类型和结构体类型。 |
这里先介绍一下基本数据类型,它一共分为两种:数值类型和字符类型。其中数值类型又分为整型和浮点型。
类型 | 存储大小 | 值范围 | |
---|---|---|---|
字符类型 | char | 1字节 | -128~127或0~255 |
整形 |
unsigned char | 1字节 | 0~255 |
signed char | 1字节 | -128~127 | |
int | 2或4字节 | -32,768~32,767 或 -2,147,483,648~2,147,483,647 |
|
unsigned int | 2或4字节 | 0~65,535 或 0~4,294,967,295 |
|
short | 2字节 | -32,768~32,767 | |
unsigned short | 2字节 | 0~65,535 | |
long | 4字节 | -2,147,483,648~2,147,483,647 | |
unsigned long | 4字节 | 0~4,294,967,295 | |
浮点型 |
float(单精度) | 4字节 | 1.2E-38~3.4E+38 |
double(双精度) | 8字节 | 2.3E-308~1.7E+308 | |
long double(双精度) | 16字节 | 3.4E-4932~1.1E+4932 |
void 类型指定没有可用的值。它通常用于以下三种情况下:
序号 | 类型与描述 |
1 | 函数返回为空: |
2 | 函数参数为空 |
3 | 指针指向 void |