C 语言入门
一、计算机系统组成
输入设备
鼠标、键盘、麦克风、扫描仪。
输出设备
显示屏、扬声器、打印机。
中央处理器(CPU)
运算速度非常快,达到 ns 级别。其内部组成包括:
- 运算器(算逻单元):负责数据运算。
- 控制器:帮助 CPU 获取指令,交给运算器。
- 寄存器:存储 CPU 用来运算的数据。
- 预取器:从内存中获取程序中的指令。
- MMU:虚拟内存映射。
内存储器(内存)
- ROM:read only memory(只读存储器)。
- RAM:random access memory(随机访问存储器)。
内存靠 "电信号" 来存储数据,断电后数据即消失,数据存储不能持久化。优点:数据读写速度快。
外存储器(硬盘)
硬盘采用 "磁信号" 来存储数据,断电后数据依然存在,能持久化存储。缺点:数据读写速度慢。
二、硬件系统
主机部分
- CPU
- 内存储器
外设部分
- 输入设备:读入。
- 输出设备:写出。
- 外存储器:持久化存储。
三、软件系统
系统软件
操作系统
优秀的商业公司、开源组织,站出来编写一套针对硬件的底层程序,管理声卡、显卡、网卡、磁盘等这些硬件。
- 概念:操作系统就是管理计算机硬件与软件资源的一个计算机程序。
- 本质:程序!
操作系统的作用可分为向下和向上两个方向:
- 向下:提供驱动程序,管理硬件。
- 向上:
- 图形界面:普通用户,鼠标点点点。
- 终端界面:普通用户、开发人员都可以使用。
- 系统调用:操作系统提供给开发人员使用的函数。
常用操作系统:
- Windows:微软。
- macOS:苹果。
- Linux。
- Unix。
语言系统
- 计算机语言:C、C++、Java、Python、PHP ……
- 机器语言:二进制(如
10101001)。
应用软件
需要根据实际需求来制定功能,例如:
- 文件处理
- 图形处理
- 表格处理
- 实时控制
编译器和语言
编程语言
- 作用:控制计算机硬件工作。
- 组成:字母、特殊字符。
- 每个编程语言都有自己一套规则、语法。——这就是学习目标!
编译器
- 原因:CPU 只认识
1010010这样的二进制码,abc、汉字它看不懂。 - 作用:将人类易读易懂的语言转换成 CPU 能读懂的语言,这个过程就是 编译。
- 语言不同,语法不同,因此使用的编译器不同:
- Java 使用
javac编译器,不能拿来编译 C 语言。 - C 语言使用
gcc编译器,不能拿来编译 Java 语言。
- Java 使用
四、C 语言简述
计算机语言发展史
- 机器语言:如
101100110。 - 汇编语言:使用助记符(如
abc对应10100101)。问题:硬件不同,指令不同,不同架构(CPU)指令集不同,只能支持某一种特定的硬件,跨平台性差。由此衍生出 B 语言。 - C 语言:借助编译器,就能将 C 代码转换成各种平台使用的指令,实现跨平台。
- C++、Java、OC、Python:面向对象编程,程序扩展性好!
- SQL 语句:更贴近人类理解。
机器生汇编,汇编生 B,B 生 C,C 生万物!!
五、C 语言标准
标准简史
- 1972 年,C 语言在贝尔实验室诞生,丹尼斯·里奇参考 B 语言开发。
- 1970-80 年代,C 语言被广泛应用,产生很多不同的 C 语言版本,程序可移植性比较差。
- 1983 年,美国国家标准委员会(ANSI)成立一个小组来制定 C 语言的标准,规定 C 语言支持哪些语法、支持哪些功能等等。
- 1989 年,通过了 C 语言的第一个标准,即 C89 标准。
- 1990 年,国际标准化组织(ISO)和国际电工委员会(IEC)将 C89 标准当做国际的 C 语言标准,即 C90 标准。(C89 和 C90 指的是同一个标准。)
- 1994 年,ISO 和 IEC 对 C89 标准进行修订,即 C94 标准。由于并没有增加新的语法特性,还是叫做 C89 或者 C90。
- 1995 年,ISO 和 IEC 再次做了修正,即 C95 标准。
- 1999 年,ISO 和 IEC 发布了 C 语言新标准(C 语言第二个标准)。在该标准中,新增许多实用的 C 语言语法特性,增加新的关键字、可变长数组等等,即 C99 标准。
- 2007 年,重新修订了 C 语言。
- 2011 年,发布新的版本,新增了一些语法,如泛型、国际化支持。目前为止最新版本是 C11。
标准的影响
- 可将 C 语言的标准理解为 C 语言说明书。但它并没有强制性约束力。例如:微软拿到标准,认为有些标准不合理,便不支持;微软认为某些特性非常好,但标准中没有,就自己新增语法。
- 如果编译器不支持标准,我们即使使用标准中的语法仍然会报错。
- 编译器版本也会影响程序。因此,编写程序之前要确定编译器版本。
- 常见的 C/C++ 编译器:
- Borland C++:宝蓝公司。
- Intel C++:英特尔编译器。
- VC++:微软公司。
- g++ 编译器(gcc 是编译套件):Linux 默认使用的编译器,对标准支持最好。
C 语言的优缺点
优点:
- 学习成本低。
- 运行速度快。
- 功能强大。
缺点:
- 代码实现周期长。
- 可移植性差。
- 对经验要求高。
- 对平台库依赖多。
C 语言的应用领域
- 服务器。
- 操作系统。
- 上层应用(MFC、QT)。
- 嵌入式。
- 人工智能、硬件驱动。
- 中间件。
- 网络攻防、数据安全。
- 大学必修课。
- 名企、外企。
C 语言 32 个关键字
📷(此处原文为配图,略)
六、文本编辑 HelloWorld
编写第一个程序的步骤
- 修改计算机显示扩展名(显示文件的后缀名)。
- 打开任意一个目录。
- 编写第一个 hello world 程序。
- 编译 hello world 程序 ——> 得到机器能识别的二进制码。
其中 cd 目录 命令的含义:进入这个目录。
第一个程序代码如下:
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
快捷打开 HelloWorld.c 文件所在目录
- 进入到 HelloWorld.c 文件所在目录。
- 直接在 "地址栏" 中键入
cmd,即可切换到该目录,不需要cd 目录。
七、常见 IDE
IDE:集编辑器、编译器、调试器于一身的集合工具。
| 平台 | 常见 IDE / 工具 |
|---|---|
| Windows | VS2013、VS2015、VS2017、VS2019;CLion(跨平台);Qt Creator(跨平台);Eclipse |
| macOS | Xcode;CLion(跨平台);Qt Creator(跨平台);Eclipse |
| Linux | vi/vim(文本编辑器);CLion(跨平台);Qt Creator(跨平台);Eclipse |
VS2019 基本使用
- 打开 VS2019,新建项目。
- 创建项目,指定项目目录。
- 确保保留 "解决方案资源管理器"。
- 创建
helloworld.c文件。 - 编写
helloworld.c程序。 - 修改字体:工具 —— 选项 —— 环境 —— 字体和颜色,选择字体。(
Ctrl + 鼠标滚轮可放大、缩小字号。) - 编写完成,点击运行图标运行。
📷(此处原文为配图,略)
解决窗口一闪而过问题
-
使用函数解决:在
return 0;代码前添加一行代码system("pause");system("pause"); -
修改 VS2019 工具配置属性解决:项目名上,右键 —— 属性 —— 配置属性 —— 连接器 —— 系统 —— 子系统 —— 下拉框中选择 "控制台 (/SUBSYSTEM:CONSOLE)" —— 点击 "应用" —— 点击确定。
八、HelloWorld 释义
代码释义
以下面这段代码为例:
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
#:代表引入头文件专用特殊字符。include:引入头文件专用关键字。<>:用来包裹库头文件名。stdio.h:使用的头文件。因为程序中使用了printf()函数,就必须使用该头文件。std:标准,standard。i:input,输入。o:output,输出。
int:main 函数返回值为整型 int。main:整个程序的入口函数。任何.c程序,有且只有一个 main 函数。(void):当前 main 函数没有参数。{}:内部放函数体。printf("hello world!\n"):printf():C 语言向屏幕输出字符使用的函数。hello world!:待写出的字符串内容。\n:回车换行。
return 0;:return:返回。C 程序要求,main 函数要有返回值,借助 return 实现返回。0:成功!因为返回类型是 int,返回整数。
注意事项
- 程序中使用的所有的字符,全部是 "英文半角" 字符。
- 程序中,严格区分大小写。
;代表一行结束。不能使用中文 ";",必须是英文。
代码运行 4 种模式
- Debug x86:以调试模式,运行 32 位程序。
- Debug x64:以调试模式,运行 64 位程序。
- Release x86:以发布模式,运行 32 位程序。
- Release x64:以发布模式,运行 64 位程序。
- Debug:调试模式。生成的
.exe文件比 Release 模式生成的文件大,带有调试信息。学习中,只使用该模式。 - Release:发布模式。生成的
.exe文件没有调试信息,文件较小。
热键:运行编写好的程序 —— Ctrl + F5。
注释
- 单行注释:
// 待注释的内容 - 多行注释:
/* 待注释的内容 */
多行注释内,可以嵌套单行注释;多行注释之间不能嵌套。
九、System 函数
作用:执行 Windows 系统中指定的命令。
常用命令:
| 命令 | 作用 |
|---|---|
pause | 暂停 |
cmd | 启动新的终端 |
calc | 唤起 Windows 下的计算器 |
notepad | 唤起 Windows 下的记事本 |
mspaint | 唤起 Windows 下的画图工具 |
cls | 清空当前 Windows 终端中的内容 |
Sleep() 函数
Sleep() 函数用于指定程序睡眠,默认单位是毫秒,需要使用头文件 #include <Windows.h>。
综合示例代码:
#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 钟
// system("cmd"); // 3s 后,再有机会执行。启动一个新终端。
// system("calc"); // 3s 后,启动计算器
// system("notepad"); // 3s 后,启动记事本
// system("mspaint"); // 3s 后,启动画图工具
system("cls"); // 3s 后,将当前终端清空。
return 0; // 因为 main 返回 int 。所以这里有 return 0;
}