C++入坑篇

第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」文件时,编译器主要做如下操作:

  1. 检查代码是否符合C++语言规范,如果不符合,给出对应有问题的行号。直到代码中所有的语法错误都被修改完,才能通过。
  2. 将代码转换成由机器语言组成的文件,被称作「目标文件」。后缀是「.o」或者「.obj」,前缀与对应的cpp文件名一致。

如下,有3个「.cpp」文件,生成3个对应「.o」目标文件。

2.3. 链接

① 工具库文件(第三方功能库目标文件) 、自己的目标文件、C++标准库,三者链接起来

② 库文件(类似第三方jar包):别人实现的独立程序功能编译出一堆目标文件,打包在一起,形成功能库

链接器检查所有跨文件依赖;A.cpp定义B.cpp使用,将AB依赖连接起来;链接依赖异常会给对应报错

为得到最终的可执行文件,需使用「链接器」将目标文件组合一起。需链接到一起的有如下三部分:

  1. 编译器产出的目标文件
  2. C++标准库。C++语言本身不提供太多功能,许多额外有用功能被打包到「C++标准库」中。一般情况下会默认链接C++标准库,不需要额外设置。
  3. 其它预编译好的库文件。许多目标文件,打包到一起,其它程序可以使用它的功能,称为库文件。例如,如果想编写播放音乐的软件,如何解析与验证音频,如何让硬件来播放。完成这些功能需要大量的编程工作。为完成需求,下载已经编写好的支持这些功能的库。使用别人的库来快速开发程序。

在产出最终的可执行文件时,链接器检查所有跨文件依赖。例如,在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 和代码编辑器


不使用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」。

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}

使用「g++」对cpp文件进行编译。

1
g++ -o HelloWorld HelloWorld.cpp

编译完成后,当前目录下看见可执行文件「HelloWorld」。

如下命令执行,即可得到运行效果。

1
./HelloWorld

5. 程序结构不同之处

和C语言类似,与[ std 标准] 这三个字母干上了!

① 打印内容到cmd中需要借助#include <iostream>;

std::cout << "n = " << n << std::endl;

std:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值