【C++从入门到精通】第0篇:编程语言和C/C++


0.1 编程语言

计算机程序(即应用程序)是计算机可以执行的一组指令,以便执行某些任务。创建计算机程序的过程称为编程。程序员通常通过生成源代码(简写为代码)来创建程序,源代码是键入一个或多个文本文件的命令列表。

组成计算机并执行程序的物理计算机部件的集合称为硬件。当计算机程序加载到内存中并且硬件按顺序执行每条指令时,这称为运行执行程序

0.2.1 机器语言

CPU能理解的有限指令集称为机器码(或机器语言、指令集)。

这是一个示例机器语言指令: 10110000 01100001(由二进制数构成)

当计算机首次发明时,程序员必须直接用机器语言编写程序,这是一件非常困难和耗时的事情。

需要注意的是,每条指令都是由1和0组成。每个单独的0或1称为二进制数字,或简称为(就是我们常说的比特,bit)。

另外,组成单个命令的位数各不相同,例如,某些CPU处理的指令长度始终为32位,而其他一些CPU(如x86系列)的指令长度可以是可变的。

其次,每组二进制数字被CPU解释为一个命令来执行非常具体的工作,例如比较这两个数字或将此数字放在某内存位置。

但是,由于不同的CPU具有不同的指令集,因此为一种CPU类型编写的指令不能在不共享相同指令集的CPU上使用。这意味着程序通常不能移植到不同类型的系统(无需大量返工即可使用),并且必须重新编写。

0.2.2 汇编语言

由于机器语言对人类来说很难阅读和理解,所以人们发明了汇编语言。汇编语言是一种低级语言。在汇编语言中,每条指令都由一个缩写(而不是一组位)来标识,并且可以使用名称和其他数字。

以下是与上述汇编语言相同的指令: mov al, 061h

这使得汇编比机器语言更容易读写。但是,CPU不能直接理解汇编语言。相反,汇编程序必须先翻译成机器语言,然后才能由计算机执行。这是通过使用汇编程序来完成的。用汇编语言编写的程序速度非常快,因此在一些情况下,汇编语言仍然被使用。

但是,汇编语言仍然有一些缺点。首先,即使是简单的任务,汇编语言仍然需要大量的指令来完成。虽然单个指令本身在某种程度上是人类可读的,但理解整个程序正在做什么可能有点困难(这有点像试图通过单独查看每个字母来理解一个句子)。其次,汇编语言仍然不是很便携——为一个CPU编写的程序无法在使用不同指令集的硬件上运行,需重写或进行大量修改。

0.2.3 高级语言

为了解决可读性和可移植性问题,人们又开发了新的编程语言出来,如C,C++,Pascal(以及后来的Java,Javascript和Perl等语言)。这些语言被称为高级语言,因为它们旨在让程序员编写程序,不必关心程序将在哪种计算机上运行。

以下是与上述语言相同的C/C++指令:a = 97;

与汇编程序非常相似,用高级语言编写的程序必须翻译成计算机可以理解的格式才能运行。完成此操作有两种主要方法:编译解释

编译的过程如下:

由编译器
生成
运行
生成
高级语言源代码
编译
可执行文件
可执行文件
硬件
运行结果

解释器是一种直接执行源代码中的指令的程序,无需将它们先编译成可执行文件。解释器往往比编译器更灵活,但在运行程序时效率较低,因为每次程序运行时都需要完成解释过程。也就是程序运行时都需要解释器。

以下是解释过程的简化表示:

由编译器
运行
生成
高级语言代码
编译
硬件
运行结果

大多数语言都可以编译或解释,但是,像C,C++和Pascal这样的语言是需要编译的,而像Perl和Javascript这样的“脚本”语言倾向于解释。有些语言,如Java,混合使用二者。

高级语言具有许多理想的属性。

**首先,高级语言更容易阅读和编写。**因为这些命令更接近我们每天使用的自然语言(这里指的是英文)。

**其次,高级语言执行与低级语言相同的任务所需的指令更少。**这使程序更简洁,更易于理解。在C++中,您可以在一行程序中执行像a = b * 2 + 5;这样的操作。在汇编语言中,这需要5或6个不同的指令。

**第三,程序可以为许多不同的系统编译,并且您不必更改程序以在不同的CPU上运行。**举个例子:

高级语言代码
x86硬件编译器
x86可执行文件
PowerPC硬件编译器
PowerPC可执行文件
MIPS硬件编译器
MIPS可执行文件

可移植性有两个例外。

首先,许多操作系统(如Microsoft Windows)都包含在代码中使用特定功能的功能。这些在以可移植性为代价上,可以使为特定操作系统编写程序变得更加容易。

第二个是一些编译器还支持特定于编译器的扩展——如果您使用这些扩展,您的程序将无法由不支持相同扩展的其他编译器编译而无需修改。


0.3 C/C++

0.3.1 C语言

C语言由贝尔实验室的丹尼斯 · 里奇(Dennis Ritchie)于1972年开发,主要作为一种系统编程语言(用于编写操作系统的语言)。

1973年,丹尼斯 · 里奇和肯 · 汤普森(Ken Thompson)使用C重写了大部分Unix操作系统。许多以前的操作系统都是用汇编编写的。与生成只能在特定CPU上运行的程序的汇编不同,C具有出色的可移植性,允许Unix在许多不同类型的计算机上轻松重新编译并加速其采用。

1978年,丹尼斯 · 里奇和肯 · 汤普森出版了一本名为《C编程语言》(The C programing language)的书。这本书通常被称为K&R(以作者的姓氏命名),这本书也被广大程序员称为“C语言的白皮书”。

1983年,美国国家标准协会(ANSI)成立了一个委员会,为C建立正式的标准。

1989年,他们完成并发布了C89标准,称为ANSIC。

1990年,国际标准化组织(ISO)采用了ANSIC(进行了一些小的修改)。这个版本的C被称为C90。

1999年,ISO委员会发布了一个名为C99的新版本C。C99采用了许多已经作为扩展进入编译器的功能。

0.3.1 C++

1979年,C++由贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)开发,是C语言的扩展。

C++为C语言增加了许多新功能。C++之所以声名鹊起,主要因为它是一种面向对象的语言。

1998年,C++由ISO委员会标准化(ISO标准委员会批准了一份描述C++语言的文档,以帮助确保所有编译器遵守同一组标准)。该语言的一个小更新于2003年发布(称为C++03)。

从那时起,C++语言进行了五次重大更新(C++11、C++14、C++17、C++20 和 C++23),每次都增加了额外的功能。特别是C++11增加了大量的新功能,被广泛认为是该语言的新基准版本。预计该语言的未来升级每三年左右一次。

该语言的每个新正式版本都称为语言标准(或语言规范),标准以其发布的年份命名。

0.3.2 C++的优势与劣势

C++在需要高性能和精确控制内存和其他资源的情况下表现出色。以下是最有可能用C++编写的几种常见应用程序类型:

  • 电子游戏
  • 实时系统(例如用于运输、制造等)
  • 高性能金融应用(例如高频交易)
  • 图形应用程序和模拟
  • 生产力/办公应用
  • 嵌入式软件
  • 音频和视频处理
  • 人工智能和神经网络

0.3.2.1 优势

(1)高效性: C++是一种编译型语言,可以生成高效的机器语言代码,能为高负荷、大量数据的应用程序提供高速执行能力。
(2)系统级编程: C++可以直接访问底层硬件、操作系统资源,非常适合开发操作系统、网络协议和驱动程序等方面的工作。
(3)面向对象编程: C++支持面向对象编程,可以以抽象的方式描述复杂的问题,使代码更易于理解和维护。
(4)跨平台性: C++可以在各种操作系统上运行,并且支持多种编译器和系统架构。
(5)可扩展性: C++是一种非常灵活的语言,可以通过添加库和框架来扩展其功能。

0.3.2.2 劣势

(1)学习曲线陡峭: C++是一门复杂的语言,需要花费一定的时间和精力来掌握其各种概念和语法。
(2)容易出错: C++允许程序员访问底层资源,但也意味着程序员必须自己管理内存,容易出现内存泄漏和指针问题等错误。
(3)代码冗长: C++的语法比其他语言更为冗长,需要编写大量的代码来完成相同的任务。
(4)编译时间长: C++的编译时间往往比其他语言长,这可能使开发和测试过程变得缓慢。


0.4 C++开发

C++的开发步骤如下:

步骤1:定义要解决的问题
步骤2:设计解决方案
步骤3:编写程序
步骤4:编译程序
步骤5:链接对象文件
步骤6:测试
步骤7:调试

0.4.1 步骤1:定义要解决的问题

提出你想要编程的最初想法是最简单,也是最难的一步。但从概念上讲,它是最简单的。您所需要的只是一个可以很好地定义的想法,并且您已准备好进行下一步。

以下是一些示例:

  • “我想编写一个程序,允许我输入许多数字,然后计算平均值。”
  • “我想编写一个程序来生成一个2D迷宫,并让用户在其中行走,如果用户到达终点,他们就会赢。”
  • “我想编写一个程序,读取股票价格文件并预测股票是上涨还是下跌。”

0.4.2 步骤2:设计解决方案

这是软件开发中最容易被忽视的步骤。问题在于有很多方法可以解决问题——但是其中一些解决方案是好的,其中一些是不好的。

通常,良好的解决方案具有以下特征:

  • 简单(不会过于复杂或令人困惑)。
  • 有据可循(特别是围绕所做的任何假设或限制)。
  • 模块化构建(以后可以重复使用或更改部件,而不会影响程序的其他部分)。
  • 强大(可以在发生意外情况时恢复或提供有用的错误消息)。

当您坐下来立即开始编码时,您可以实施最快实现目标的解决方案。这可能导致程序难以更改或扩展,或者存在大量错误(bug)。

顺便说一句……
托马斯·爱迪生在1870年代首次使用bug一词!然而,这个词在1940年代流行起来,当时工程师发现一只真正的飞蛾卡在早期计算机的硬件中,导致短路。报告错误的日志和飞蛾现在都是史密森尼美国历史博物馆的一部分。可以在这里查看。

0.4.3 步骤3:编写程序

为了编写程序,我们需要两件事:首先,我们需要编程语言的知识——这就是这些教程的目的!其次,我们需要一个文本编辑器来编写和保存我们编写的程序。我们使用C++指令编写的程序称为源代码(通常缩写为代码)。可以使用任何你想要的文本编辑器编写程序,即使是像Windows的记事本或Unix的vi或pico这样简单的东西。但是,我们强烈建议您使用专为编程而设计的编辑器(代码编辑器,code editor)。如果您还没有,请不要担心。我们将很快介绍如何安装代码编辑器。

为编码设计的典型编辑器具有一些使编程更容易的功能,包括:

  1. 行号。 当编译器给我们一个错误时,行号很有用,因为典型的编译器错误会指出:一些错误代码/消息,第64行。如果没有显示行号的编辑器,查找第64行可能会非常麻烦。
  2. 语法突出显示和着色。 语法突出显示和着色会更改程序各个部分的颜色,以便更轻松地识别程序的不同组件。下面是一个同时突出显示行号和语法的C++程序示例:
#include <iostream>

int main()
{
    std::cout << "Colored text!";
    return 0;
}
  1. **明确的固定宽度字体。**非编程字体通常很难区分数字0和字母O,或者很难区分数字1、字母l(小写L)和字母I(大写i)。一个好的编程字体将确保这些符号在视觉上是有区别的,以确保一个符号不会意外地被用来代替另一个符号。

您编写的程序通常会被命名为文件名.cpp,其中某些内容被替换为您选择的程序名称(例如计算器,hi-lo等)。.cpp扩展告诉编译器(和您)这是一个包含C++指令的C++源代码文件。请注意,有些人使用扩展名.cc而不是.cpp,但我们建议您使用.cpp

另请注意,许多复杂的C++程序具有多个.cpp文件。尽管最初要创建的大多数程序只有一个.cpp文件,但可以编写具有数十或数百个.cpp文件的单个程序。

编写程序后,接下来的步骤是将源代码转换为我们可以运行的内容,然后查看它是否有效!我们将在下一节中讨论这些步骤。


0.5 编译器、链接器和库简介

继续讨论上一节的内容,让我们讨论步骤4。

0.5.1 步骤4:编译程序

为了编译C++程序,我们使用C++编译器。C++编译器按顺序遍历程序中的每个源代码 (.cpp) 文件,并执行两项重要任务:

首先,它会检查您的代码以确保它遵循C++语言的规则。如果没有,编译器会给你一个错误(和相应的行号),以帮助查明需要修复的内容。编译过程也将中止,直到错误得到修复。

其次,它将C++源代码转换为称为对象文件的机器语言文件。对象文件通常命名为name.oname.obj,其中name.o与产生它的.cpp文件名字相同。

如果您的程序有3个.cpp文件,编译器将生成3个目标文件:

编译
编译
编译
源文件:Calculator.cpp
对象文件:Calculator.obj
源文件:Fraction.cpp
对象文件:Fraction.obj
源文件:Math.cpp
对象文件:Math.obj

C++编译器可用于许多不同的操作系统。我们将很快讨论安装编译器,因此我们现在不会这样做。

0.5.2 步骤5:链接对象文件

编译器创建一个或多个对象文件后,另一个称为链接器的程序将启动。链接器的工作有三个方面:

首先,获取编译器生成的所有目标文件,并将它们组合到单个可执行程序中。

对象文件:Calculator.obj
链接器
可执行文件:Calculartor.exe
对象文件:Fraction.obj
对象文件:Math.obj
C++标准库
其他库

其次,除了能够链接对象文件外,链接器还能够链接库文件。库文件是预编译代码的集合,这些代码已被“打包”以在其他程序中重用。

C++核心语言实际上相当小而简洁。但是,C++还附带了一个称为C++标准库(通常缩写为标准库)的广泛库,该库提供了可在程序中使用的其他功能。C++标准库中最常用的部分之一是iostream库,它包含用于在显示器上打印文本和从用户获取键盘输入的功能。几乎每个编写C++程序都以某种形式使用标准库,因此标准库链接到您的程序中是很常见的。大多数链接器会在您使用标准库的任何部分后立即自动链接,因此这通常不需要您担心。

您还可以选择链接其他库。例如,如果你要编写一个播放声音的程序,你可能不想编写自己的代码来从磁盘读取声音文件,检查以确保它们有效,或者弄清楚如何将声音数据路由到操作系统或硬件以通过扬声器播放——这将是很麻烦的工作!相反,您可能会下载一个已经知道如何做这些事情的库,并且使用它。

第三,链接器确保正确解析所有跨文件依赖项。例如,如果在一个.cpp文件中定义某些内容,然后在另一个cpp文件中使用它,则链接器会将两者连接在一起。如果链接器无法将引用连接到具有其定义的某些内容,则会收到链接器错误,并且链接过程将中止。

链接器完成链接所有对象文件和库后(假设一切顺利),您将拥有一个可执行文件,然后可以运行该文件!

0.5.3 步骤6和7:测试和调试

这是有趣的部分(希望如此)!您可以运行可执行文件并查看它是否产生您期望的输出!

如果您的程序运行但无法正常工作,那么是时候进行一些调试以找出问题所在了。我们将很快更详细地讨论如何测试您的程序以及如何调试它们。

0.5.4 集成开发环境(IDE)

请注意,步骤3、4、5 和7都涉及软件(编辑器、编译器、链接器、调试器)。虽然您可以为每个活动使用单独的程序,但称为集成开发环境(IDE)的软件包会将所有这些功能捆绑在一起并集成在一起。我们将在下一节中讨论并安装一个IDE。


0.6 安装集成开发环境(IDE)

集成开发环境(IDE)是一种软件,其中包含开发、编译、链接和调试程序所需的所有内容。

使用典型的C++ IDE,您将获得一个执行行号和语法突出显示的代码编辑器。许多(但不是全部)IDE都包含一个C++编译器和一个链接器,IDE将知道如何与它们交互,以便将源代码转换为可执行文件。当您需要调试程序时,可以使用集成的调试器。

此外,IDE通常捆绑了许多其他有用的编辑功能,例如集成帮助、名称完成、自动格式化,有时还有版本控制系统。因此,虽然您可以单独执行所有这些操作,但安装IDE并从单个界面访问它们要容易得多。

所以让我们安装一个!显而易见的下一个问题是:“哪一个?”,许多 IDE 都是免费的,如果您想尝试多个IDE,可以安装多个IDE。我将在下面推荐一些我喜欢的IDE。

0.6.1 Visual Studio(for Windows)

如果您在Windows 10计算机上进行开发,那么我强烈建议下载Visual Studio 2022社区版

进入网站后,点击“Community”下的“免费下载”按钮。
在这里插入图片描述
下载完成后打开安装程序,选择“C++桌面开发”,并确保右侧中勾选了Windows 10 SDK(或Windows 11 SDK)。请添加图片描述

0.6.2 Visual Studio Code

Visual Studio Code(也称为“VS Code”,不要与类似名称的“Visual Studio Community”混淆),是经验丰富的开发人员的热门选择,因为它快速,灵活,开源,适用于多种编程语言,并且可用于许多不同的平台。

进入网站后,点击对应版本进行下载。下载完成后打开。
在这里插入图片描述
选择“我同意此协议”,点击下一步。
在这里插入图片描述
勾选所有附加任务,点击下一步。
在这里插入图片描述
点击安装即可。

0.6.3 Dev C++

Dev C++集合了功能强大的源码编辑器、MingW64/TDM-GCC编译器、GDB调试器和AStyle格式整理器等众多自由软件,适合于在教学中供C/C++语言初学者使用,也适合于非商业级普通开发者使用。

进入官网,点击“Download”按钮,等待5秒后开始下载。下载完成打开。

在这里插入图片描述

选择语言(中文或英文都行),点击OK。
在这里插入图片描述
点击“I Agree”。
在这里插入图片描述
点击“Next”。
在这里插入图片描述
修改安装路径,点击“Install”。
在这里插入图片描述


0.7 编译你的第一个程序

在编写第一个程序之前,我们需要学习如何在集成开发环境(IDE)中创建新程序。

0.7.1 项目

要在IDE中编写C++程序,我们通常从创建一个新项目开始(稍后我们将向您展示如何执行此操作)。项目是一个容器,用于保存所有源代码文件、图像、数据文件等…生成可以运行或使用的可执行文件(或库、网站等)所需的。该项目还会保存各种IDE、编译器和链接器设置,并记住上次中断的位置,以便以后重新打开项目时,可以将IDE的状态还原到上次中断的位置。当您选择编译程序时,项目中的所有.cpp文件都将被编译和链接。

每个项目对应一个项目群。当您准备好创建第二个程序时,您需要创建一个新项目,或者覆盖现有项目中的代码(如果您不想保留它)。项目文件通常是特定于IDE的,因此需要在不同的IDE中重新创建为一个IDE创建的项目。

最佳实践
为您编写的每个新程序创建一个新项目。

0.7.2 控制台项目

创建新项目时,系统通常会询问您要创建哪种类型的项目。我们将在本教程中创建的所有项目都将是控制台项目。控制台项目意味着我们将创建可以从Windows,Linux或Mac控制台运行的程序。

下面是Windows控制台的屏幕截图(通过Windows+R后输入cmd打开):

在这里插入图片描述
默认情况下,控制台应用程序没有图形用户界面 (GUI),它们将文本打印到控制台,从键盘读取输入,并编译为独立的可执行文件。这非常适合学习C++,因为它将复杂性降至最低,并确保在各种系统上工作。

如果您以前从未使用过控制台,或者不知道如何访问它,请不要担心。我们将通过 IDE 编译和启动程序(必要时将调用控制台)。

0.7.3 工作空间/解决方案

为程序创建新项目时,许多IDE会自动将项目添加到“工作区”或“解决方案”(该术语因IDE而异)。工作区或解决方案是可以容纳一个或多个相关项目的容器。例如,如果您正在编写游戏并希望为单人游戏和多人游戏提供单独的可执行文件,则需要创建两个项目。这两个项目完全独立是没有意义的——毕竟,它们是同一个游戏的一部分。最有可能的是,每个工作区/解决方案都将配置为单个工作区/解决方案中的单独项目。

尽管可以将多个项目添加到单个解决方案,但我们通常建议为每个程序创建新的工作区或解决方案,尤其是在学习时。它更简单,出错的可能性更小。

0.7.4 编写你的第一个程序

传统上,第一个用新语言编写的程序程序员是臭名昭著的hello world程序(也就是下面这个程序),我不会剥夺您的这种体验!你以后会感谢我们的。或许吧。

#include <iostream>
int main()
{
	std :: cout << "Hello World" << std :: endl;
}

如果您完成了这些,那么恭喜,您完成了本教程中最困难的部分(安装IDE并编译您的第一个程序)!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值