C语言概述
1. 计算机系统组成
1.1 硬件系统
1.1.1 主机
(1)中央处理器
中央处理器(Central Processing Unit, CPU):运算速度非常快,是纳秒(ns)级别。
- 控制器:帮助CPU获取指令,并把运算相关指令传递给运算器,把相关数据传递给寄存器。
- 运算器:也叫算逻单元,负责数据的相关运算。
- 寄存器:用来临时存储CPU中用来计算的数据,并且临时保存运算之后得到的数据。
- 预取器:帮助控制器从内存中获取程序中的指令。
- MMU:虚拟内存映射
(2)内存储器
内存储器,又叫内存。是用“电信号”来存储数据,断电数据消失,所以数据存储不能持久。其优点是数据的读写速度快。分为ROM和RAM。
- ROM(Read Only Memory):只可以读取,不能够写入。
- RAM(Random Access Memory):可以读取,也可以写入。
1.1.2 外部设备
(1)输入设备
- 键盘、鼠标、摄像头、麦克风、扫描仪等。
(2)输出设备
- 显示器(显卡)、扬声器(声卡)、打印机等。
(3)外存储器
- 即硬盘、磁盘。是用“磁信号”来存储数据,断电时数据依然存在,可以持久化存储。其缺点是数据的读写速度较慢。
Q1 内存储器和外存储器(即硬盘)有什么区别?
- 存储数据的信号不同:内存储器是“电信号”,外存储器是“磁信号”。
- 持久性不同:内存储器断电则数据消失,不持久;但是外存储器断电时数据也不消失,可以持久性存储。
- 数据读写速度不同:内存储器读写速度快,外存储器读写速度慢。
Q2 计算机硬件之间的工作流程是什么样的?
(外存储器(即硬盘)、内存储器、CPU中预取器、CPU中寄存器都是用来存储数据,他们之间的工作流程是什么样的?)
- 硬盘中的数据可以是来源于网络下载下来的,也可以是本身存储的。
- 内存从硬盘中读取数据。
- 内存中的数据要经过一级或者多级Cache缓存,即数据通过一个或者多个Cache存储区域。(Cache缓存在内存和寄存器之间的数据流动中起到一个缓冲的作用)
- 预取器帮助CPU中的控制器获取在最后一级Cache缓存中的指令(即代码)。
- CPU中控制器将需要执行的运算指令传递给运算器,将需要执行运算的数据从Cache缓存中传递给寄存器存储。
- 运算器从存储器中调用数据进行计算,并将计算结果再保存到寄存器中。
- 寄存器中的计算数据结果再通过多级Cache缓存、内存、最后保存在硬盘中。
1.2 软件系统
1.2.1 系统软件
(1)操作系统
- 概念:是管理计算机硬件和软件资源的一个计算机程序,他的本质是程序。
- 来源:优秀的商业公司和开源组织编写的一套针对硬件的底层程序 。
- 作用:
- 向下:提供驱动,管理声卡、显卡、网卡、磁盘等硬件。
- 向上:提供了与硬件交互的三种形式。
- 图形界面:普通用户和开发人员在计算机屏幕上用鼠标键盘等进行操作,显示器呈现的可视化图形界面。
- 终端命令:普通用户和开发人员都可以使用的终端命令。
- 系统调用:操作系统提供给开发人员使用的函数。
- 常用的操作系统
- 微软的Windows系统
- 苹果的MacOS系统
- Linux
- Unix
(2)语言系统
- 计算机语言:C、C++、Java、PHP、Python…
- 机器语言:二进制(01010110)
1.2.2 应用软件
根据实际的需求,来制定功能。
- 文字处理软件
- 表格处理软件
- 图形处理软件
- 实时控制软件
2. C语言简述
2.1 计算机编程语言与编译器
2.1.1 计算机编程语言
- 作用:控制计算机硬件进行工作。
- 组成:字母和特殊字符按照每个编程语言自己的一套规则、语法进行组成。
2.1.2 编译器
- 使用编译器原因:CPU只识别10100101二进制编码,不识别其他中文中文等。
- 作用:将人类易读易懂的编程语言转换成CPU能读懂的语言,即进行编译。
- 语言不同,使用的编译器也不同,如Java使用Javac编译器,不能用来编译C语言;C语言使用gcc进行编译,不能用来编译Java。
2.1.3 常用的编译器
- 宝蓝公司的 Borland C++ 编译器
- 英特尔公司的 Intel C++ 编译器
- 微软公司的 VC++ 编译器
- 来源于开源组织的 g++ 编译器(gcc是编译套件),是Linux默认使用的编译器,对标准的支持最好。
2.2 计算机语言发展
- 机器语言:二进制(10101010)
- 汇编语言:使用助记符,用英文字母组成的指令代替二进制机器语言。
- 存在问题:硬件不同,使用的指令不同,不同的架构(CPU)的指令集也不同。所以一种指令往往只能支持某一种特定的硬件,跨平台性差。
- 衍生出B语言。
- C语言:借助编译器可以将C代码转换成各种平台使用的指令,实现跨平台。
- C++、Java、Oc、Python等。
- SQL语句:人类更容易理解。
机器生汇编,汇编生B,B生C,C生万物!
2.3 C语言
2.3.1 C语言标准
最重要的是三个标准:
- C89或者C90:其中C89是1989年美国国家标准委员会ANSI完成制定的美国国家层面的,C90是1990年国际标准化组织ISO和国际电工委员会IEC将C89标准当做了国际的C语言标准进行使用。
- C99:是1999年ISO和ICE发布的新的C语言标准。
- C11:是2011年发布的新版本。
2.3.2 C语言标准的影响
- C语言标准并没有强制性约束力,微软拿到标准,认为有些标准不合理,不支持。 微软认为某些特性非常好,但标准中没有,微软自己新增语法。
- 如果某个编译器不支持标准,即使标准中的语法也会出错。
- 编译器的版本也会影响程序,因此编写程序之前要确定编译器版本。
2.3.3 C语言优缺点
-
优点
- 学习成本低。
- 运行速度快。
- 功能强大。
-
缺点:
- 代码实现周期长
- 可移植性差
- 对经验要求高
- 对平台库依赖多
2.3.4 C语言的32个关键字
short int long float double char
unsigned signed
for while do if else break continue
switch case default enum case
void static const extern
goto return typedef struct union
auto volatile sizeof
2.3.5 C语言的9种控制语句
if() else
for()
while()
do while()
continue
break
switch
goto
return
2.3.6 C语言的34种运算符
- 算术运算符:+ - * / % ++ –
- 关系运算符:< > <= >= == !=
- 逻辑运算符:! && ||
- 位运算符:<< >> ~ | ^ &
- 赋值运算符:= 其扩展(如+= -=等)
- 条件运算符:? :
- 逗号运算符:,
- 指针运算符:& *
- 求字节数:sizeof
- 强制类型转换:(类型)
- 分类运算符:. ->
- 下标运算符:[]
- 其他:()
3. 第一个程序
3.1 IDE
3.1.1 概念
集成开发环境(Integrated Development Environment),集编辑器、编译器、调试器于一身的集合工具。
3.1.2 常见的IDE
-
Windows系统
- vs2013、vs2015、vs2017、vs2019
- Clion:跨平台IDE。
- Qt Creator 跨平台IDE。
- Eclipse 跨平台IDE。
-
MacOS:
- Xcode
- Clion:跨平台IDE。
- Qt Creator 跨平台IDE。
- Eclipse 跨平台IDE。
-
Linux:
- vi/vim —— 实际上是个文本编辑器,并不算是IDE。
- Clion:跨平台IDE。
- Qt Creator 跨平台IDE。
- Eclipse 跨平台IDE。
3.2 Hello World 程序
3.2.1 程序代码
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
3.2.2 代码释义
-
# : 代表引入头文件专用特殊字符。
-
include : 引入头文件专用关键字。
-
<> : 用来包裹头文件名
-
stdio.h : 使用的头文件。因为程序中使用了 printf() 函数。就必须使用该头文件。
- std:标准:standard
- i: input 输入。
- o: output 输出。
-
int :main 函数返回值为整型int。
-
main: 整个程序的入口函数。 任何.c 程序,有且只有一个 main 函数。
-
(void) : 当前main函数没有参数。
-
{} : 内部放函数体。
-
printf(“helloworld\n”) :
- printf(); C语言向屏幕输出字符使用的函数。
- helloworld: 待写出的字符串内容。
- \n: 回车换行。
-
return 0;
- return 返回。 C程序要求main 函数要有返回值,借助 return 实现返回。
- 0:成功!因为是int,所以返回整数。
3.2.3 VS中代码运行 4 种模式
- Debug x86:以调试模式,运行32位程序。
- Debug x64:以调试模式,运行64位程序。
- Release x86:以发布模式,运行32位程序。
- Release x64:以发布模式,运行64位程序。
Debug: 调试模式。生成的 .exe 文件 比 Release 模式生成文件大,因为他带有调试信息
Release:发布模式。生成的.exe 文件没有调试信息,所以文件较小。
热键:运行编写好的程序。Ctrl + F5
3.2.4 注释
- 单行注释。 // 待注释的内容
- 多行注释。 /* 待注释的内容 */
- 多行注释内,可以嵌套单行注释。 多行注释之间不能嵌套。
3.3 System函数
- 作用:执行 windows 系统中的指定的命令。
- 命令:
- pause:暂停。
- cmd:启动新的终端
- calc:唤起windows下的计算器。
- notepad: 唤起 windows下的记事本。
- mspaint: 唤起 windows下的画图工具。
- cls:清空当前windows下 终端中的内容。
#include <stdio.h> // 引入头文件 stdio.h , 因为下面使用了printf() 必须添加此头文件。
#include <Windows.h> // 引入头文件 Windows.h, 因为下面使用 Sleep() 函数。注意首字母大写。
int main(void) // main 是程序的入口函数。 void表示没有参数。int表示返回整数。
{
printf("hello world1!\n"); // 打印 helloworld 字符串,到屏幕。 \n 换行之意。
printf("hello world2!\n");
printf("hello world3!\n");
printf("hello world4!\n");
printf("hello world5!\n");
printf("hello world6!\n");
printf("hello world7!\n");
Sleep(3000);// 使当前程序打印完 helloworld 后,睡眠3s钟。Sleep() 函数,指定程序睡眠。默认单位:毫秒。需要使用头文件:#include <Windows.h>。注意Sleep首字母大写。需要头文件<stdlib.h>。
system("calc"); //3s 后启动计算器
system("notepad"); //启动记事本
system("mspaint"); //启动画图工具
system("cmd"); //启动一个新终端。
system("cls"); //将当前终端清空。
return 0; // 因为 main返回 int 。所以这里有 return 0;
}
3.4 g++编译器运行Hello World 程序
方法一:
-
Windows系统下按住Windows键和R,输入cmd,点击回车。
-
弹出窗口中输入cd Hello World 程序的地址(作用为:打开程序文件所在的目录,cd和地址中间有空格)
-
dir(展示该目录中所有文件)
-
gcc 文件名称.c -o 文件名称.exe(gcc是编译,文件名称就是程序文件的名字,-o是指定文件名,操作之后,同样的目录下多了一个exe文件)
-
直接输入文件名字.exe(执行了该文件)
方法二:
-
找到并打开程序所在文件夹。
-
在地址栏中选中地址,输入cmd。
-
dir(展示该目录中所有文件)
-
gcc 文件名称.c -o 文件名称.exe(gcc是编译,文件名称就是程序文件的名字,-o是指定文件名,操作之后,同样的目录下多了一个exe文件)
-
直接输入文件名字.exe(执行了该文件)
3.5 解决vs窗口一闪而过问题
-
使用 函数解决。
-
在 return 0; 代码前添加一行代码
system("pause");
-
-
修改 VS2019 工具配置属性解决。
- 项目名上,右键 —— 属性 —— 配置属性 ——连接器 —— 系统 —— 子系统 —— 下拉框中选择 “控制台 (/SUBSYSTEM:CONSOLE)” —— 点击 “应用” —— 点击确定。
诚挚感谢传智播客王飞老师的讲解以及提供的素材资料。