第1章:基础知识
1.讲故事
机器语言:不可移植、编程非常困难,且消耗大量时间
汇编语言:运算速度快、可读性较好、不可移植、编程还是困难
高级语言:可读性、可移植性、(C,C++,Python,Java高级语言)、也须转换成机器语言
高级语言转换成计算机能够执行的指令:俩种方式,「编译器:编译执行,先转后执行」与「解释器:解释执行,边翻译边执行」
现在手机cpu的性能比当年阿波罗登月使用的计算机快了上亿倍,但是计算机只能理解有限的简单指令,且须由我们来告诉它该执行哪些指令。
计算机的CPU不理解中文,也不理解C++。CPU能直接理解的语言,被称为机器语言(【0和1】bit组成)
计算机刚出现时,只有机器语言可以使用,编程非常困难,且消耗大量时间。
机器语言的指令只能做特定的事。比如将两个数字相加,或者访问内存的某个位置。 同时不同的CPU有不同的指令集。为一种CPU写的程序,在另一种CPU上无法运行。机器语言没有可移植性,程序必须重写才能在新的CPU上运行。
汇编语言
由于机器语言难以理解和阅读,人们发明了汇编语言。汇编语言使用简单的单词缩写和数字来替代机器语言中的指令。 例如,「mov al, 061h」,代表将061h这个数字移动到寄存器al中。相较于机器语言,汇编语言有较好的可读性。
CPU不能直接执行汇编语言。因此需要程序将汇编语言转换成机器语言。这个程序就叫做汇编器。 因为汇编语言基本与机器指令一一对应,精心编写的汇编语言有着最高的执行性能。 因此在不少需要程序执行速度的地方,仍能看到大量的汇编代码。
汇编语言仍有不少缺点:
- 简单的需求,需要大量的汇编指令才能写出。即使单条指令能明确含义,多条组合起来含义就很难理解了。
- 汇编语言也没有可移植性。不同的CPU有不同的指令集,对应不同的汇编语言。编写好的程序仍需要重写才能在其它平台运行。
高级语言
为了解决程序的可读性和可移植性,人们发明像C,C++,Python,Java等这些新的编程语言,被称为高级语言。 使用高级语言编程时,不用考虑编写的程序会在哪种机器上执行。在C++中可以写出这样的语句「a = 97」。将97赋值到变量a上。
C语言好像最终转成 clr编译器(扩展名为.o或者.obj,生成目标代码[汇编语言])->link.exe连接器(库文件+目标代码+操作系统的启动代码进行组织连接)->形成最终的可执行文件(windows下扩展名为.exe,Unix下无扩展名)
2.程序开发流程
2.1.编写程序
① C++版本的命名规则:c++ 加上发布时的年份;例如没有C++16,因为2016年没有发布新的C++标准。
② C++程序文件以「.cpp」为文件后缀,有人也喜欢使用「.cc」后缀。这里推荐使用「.cpp」
③ 选择一款好的编辑器,对C++的开发效率有提升
#include <iostream>
int main()
{
std::cout << "Hello World!";
return 0;
}
2.2. 编译
① 编译出和c语言一样的目标文件
在得到可执行程序前,要使用C++编译器对C++源代码编译。目前比较流行的编译器有GCC,LLVM,MSVC。
在编译「.cpp」文件时,编译器主要做如下操作:
- 检查代码是否符合C++语言规范,如果不符合,给出对应有问题的行号。直到代码中所有的语法错误都被修改完,才能通过。
- 将代码转换成由机器语言组成的文件,被称作「目标文件」。后缀是「.o」或者「.obj」,前缀与对应的cpp文件名一致。
如下,有3个「.cpp」文件,生成3个对应「.o」目标文件。
2.3. 链接
① 工具库文件(第三方功能库目标文件) 、自己的目标文件、C++标准库,三者链接起来
② 库文件(类似第三方jar包):别人实现的独立程序功能编译出一堆目标文件,打包在一起,形成功能库
③链接器检查所有跨文件依赖;A.cpp定义B.cpp使用,将AB依赖连接起来;链接依赖异常会给对应报错
为得到最终的可执行文件,需使用「链接器」将目标文件组合一起。需链接到一起的有如下三部分:
- 编译器产出的目标文件
- C++标准库。C++语言本身不提供太多功能,许多额外有用功能被打包到「C++标准库」中。一般情况下会默认链接C++标准库,不需要额外设置。
- 其它预编译好的库文件。许多目标文件,打包到一起,其它程序可以使用它的功能,称为库文件。例如,如果想编写播放音乐的软件,如何解析与验证音频,如何让硬件来播放。完成这些功能需要大量的编程工作。为完成需求,下载已经编写好的支持这些功能的库。使用别人的库来快速开发程序。
在产出最终的可执行文件时,链接器检查所有跨文件依赖。例如,在A.cpp中定义某个功能,在B.cpp中使用,在链接时,将依赖连接起来。
如果发现某个功能找不到定义,或有重复定义。链接器会给出对应报错。
2.4. 测试与调试
至此,运行最后得到的可执行文件,「测试」下运行的结果是否符合预期。
如果程序不能正常工作,「调试」程序,看是哪里的问题。后续详细讲解如何调试。
3.安装开发环境
Visual Studio Community (Windows)
在Windows环境中,强烈推荐安装「Visual Studio」
下载地址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器
选择最新版本的Visual Studio Community,这里的演示的版本是2022,后续所有的操作都以该版本为例。
安装时,注意选择「使用C++的桌面开发」。如果硬盘空间不够,选择更换安装位置。
Visual Studio Code(Windows Linux Mac)
严格来讲,「Visual Studio Code」只是代码编辑器,可以进行扩展来作IDE使用。 相比「Visual Studio」需自行配置。
下载地址:Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器
- Windows环境配置教程:Get Started with C++ and MinGW-w64 in Visual Studio Code
- Linux环境配置教程:Get Started with C++ on Linux in Visual Studio Code
- Mac环境配置教程:Configure VS Code for Clang/LLVM on macOS
不使用IDE
安装好对应的编译器,不用IDE也是可行的。大部分linux与mac系统自带c++编译器,使用编辑器编写代码,使用命令行编译即可。只是调试时麻烦一点。
注意事项
如果自行配置开发环境,一定要选择支持C++17以上的编译器。最低的版本需求如下:
- GCC/G++ 7
- Clang++ 8
- Visual Studio 2017 15.7
4. 第一个C++程序
① 在windows下gcc编译后的“可执行文件”无后缀名;
② 可能gcc编译器中包含了 编译+链接的过程,最后直接得到 “可执行文件”
③ 想用gcc得单独安装
准备好开发环境后,编写第一个程序。
使用Visual Studio开发
1)打开VS(Visual Studio),选择「创建新项目」。
在IDE中,「项目」代表打包生成程序所需的所有资源。 包括源代码,音频,数据文件,编译链接设置等。
当需要创建新程序时,重新创建新的项目。 不同的IDE的项目有不同的保存格式,一般无法打开其它IDE创建的项目。
2)选择控制台应用
学习C++的基础知识时,开始时选择「控制台应用」。
控制台应用,代表生成的程序,从命令行读取数据,或打印数据到命令行。 不涉及复杂的图形界面操作,同时不用修改可在不同操作系统运行,非常适合入门学习
3)填写项目名称
填写项目名称「HelloWorld」。推荐选择「将解决方案和项目放在同一目录」。
单个解决方案里,可包含多个项目,这里暂时不展开。
4)运行项目
项目打开,右侧「资源管理器」包含解决方案和项目。 「源文件」中有「HelloWorld.cpp」。 在中间的编辑器中,看到「HelloWorld.cpp」的源代码。 点击「调试」-「开始执行不调试」,即可运行程序。
这时,窗口下方「输出」框里有如下文字,代表已编译成功。 编译的可执行文件是「D:\code\HelloWorld\x64\Debug\HelloWorld.exe」。
5)查看运行效果
下图中,打印出「Hello World!」。
使用命令行进行开发
首先在编辑器中输入如下代码。保存为「HelloWorld.cpp」。
|
使用「g++」对cpp文件进行编译。
|
|
编译完成后,当前目录下看见可执行文件「HelloWorld」。
如下命令执行,即可得到运行效果。
|
|
5. 程序结构不同之处
和C语言类似,与[ std 标准] 这三个字母干上了!
① 打印内容到cmd中需要借助#include <iostream>;
std::cout << "n = " << n << std::endl;
std: