<C++>:学习入门

前言

人生如逆旅,我亦是行人。


1、编程语言简介

  • 现代计算机的速度非常快,而且一直在变快。然而,计算机也有一些重要的限制:它们本身只理解一组有限的命令,并且必须确切地告诉他们该怎么做。
  • 计算机程序(通常也称为应用程序)是计算机可以执行的一组指令,以便执行某些任务。创建程序的过程称为编程。程序员通常通过生成源代码(通常缩写为代码)来创建程序,源代码是键入到一个或多个文本文件中的命令列表。
  • 组成计算机和执行程序的物理计算机部件的集合称为硬件。当计算机程序加载到内存中并且硬件按顺序执行每条指令时,这称为运行或执行程序。

在这里插入图片描述


  • 机器语言

    我们使用的计算机无法直接识别我们写入的C++代码。计算机CPU可以直接理解的优先指令集称为 机器代码(或称为机器语言或指令集)。实际上就是我们熟知的二进制代码。

    下面是一个示例机器语言指令:10110000 01100001

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

    这些说明的组织方式超出了本介绍的范围,但有趣的是要注意两件事。首先,每条指令由 10 的序列组成。每个单独的 01 称为二进制数字,或简称位。组成单个命令的位数各不相同。例如,某些 CPU 处理长度始终为 32 位的指令,而其他一些 CPU(例如您可能使用的 x86 系列)的指令长度可变。

    其次,每组二进制数字被CPU解释为一个命令,以做一个非常具体的工作,比如比较这两个数字,或者把这个数字放在那个内存位置。但是,由于不同的 CPU 具有不同的指令集,因此为一种 CPU 类型编写的指令不能在不共享相同指令集的 CPU 上使用。这意味着程序通常不能移植(无需重大返工即可使用)到不同类型的系统,并且必须重新编写。


  • 汇编语言

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

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

    这使得汇编比机器语言更容易读写。但是,CPU不能直接理解汇编语言。相反,汇编程序必须先翻译成机器语言,然后才能由计算机执行。这是通过使用称为汇编程序的程序来完成的。用汇编语言编写的程序往往非常快,当速度至关重要时,汇编程序今天仍在使用。

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


  • 高级语言

    现在的人大部分都是在学习高级语言,也就是我们日常熟知的C语言、C++、Java等语言,都很少有人会去涉及困难的汇编语言,更别说去企及无法理解的汇编语言了。

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

    以下是与上述 C/C++ 相同的说明:a = 97;

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

    编译器 是一种程序,它读取源代码并生成一个独立的可执行程序,然后可以运行该程序。一旦您的代码被转换为可执行文件,您就不需要编译器来运行该程序。起初,编译器是原始的,并且生成缓慢,未优化的代码。然而,多年来,编译器已经变得非常擅长生成快速,优化的代码,并且在某些情况下可以比人类在汇编语言中做得更好。

    以下是编译过程的简化表示形式:
    在这里插入图片描述

    解释器 是一种程序,它直接执行源代码中的指令,而不需要先将它们编译为可执行文件。解释器往往比编译器更灵活,但在运行程序时效率较低,因为每次运行程序时都需要完成解释过程。这意味着每次运行程序时都需要解释器。
    在这里插入图片描述

    大多数语言都可以编译或解释,但是,传统上像C,C++和Pascal这样的语言是编译的,而像Perl和Javascript这样的“脚本”语言往往是被解释的。有些语言,如Java,混合使用两者。

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

    首先,高级语言更容易阅读和编写,因为这些命令更接近我们每天使用的自然语言。其次,高级语言需要更少的指令来执行与低级语言相同的任务,使程序更简洁,更易于理解。在C++你可以做一些类似在一行中的事情。在汇编语言中,这将需要5或6个不同的指令。a = b * 2 + 5;

    第三,可以为许多不同的系统编译(或解释)程序,并且您不必将程序更改为在不同的CPU上运行(您只需为该CPU重新编译)。例如:
    在这里插入图片描述
    可移植性有两个常规例外:

    • 首先,许多操作系统(如 Microsoft Windows)都包含可在代码中使用的特定于平台的功能。这些可以使为特定操作系统编写程序变得更加容易,但以牺牲可移植性为代价。在这些教程中,我们将避免任何特定于平台的代码。
    • 某些编译器还支持特定于编译器的扩展 。 如果使用这些扩展,则您的程序将无法由不支持相同扩展的其他编译器编译而不进行修改。一旦您安装了编译器,我们稍后将详细讨论这些内容。

规则、最佳做法和警告

  • 规则:

    规则是您必须按照语言的要求执行的说明。不遵守规则通常会导致您的程序无法正常工作。
  • 最佳实践:

    最佳实践是你应该做的事情,因为这种做事方式通常被认为是一个标准或强烈推荐。也就是说,要么每个人都这样做(如果你不这样做,你会做一些人们不期望的事情),要么它优于替代方案。
  • 警告:

    警告是你不应该做的事情,因为它们通常会导致意想不到的结果。

2、C++简介


  • 在C++之前,“老而不僵”的C语言

    C语言由Dennis Ritchie于1972年在贝尔电话实验室开发,主要作为系统编程语言(一种编写操作系统的语言)。Ritchie的主要目标是产生一种极简主义语言,该语言易于编译,允许有效地访问内存,产生有效的代码,并且是独立的(不依赖于其他程序)。对于高级语言,它旨在给程序员很多控制权,同时仍然鼓励平台(硬件和操作系统)的独立性(也就是说,不必为每个平台重写代码)。

    C最终变得如此高效和灵活,以至于在1973年,Ritchie和Ken Thompson使用C重写了大部分Unix操作系统。以前的许多操作系统都是用汇编语言编写的。与汇编程序不同,汇编程序只能在特定的CPU上运行,C具有出色的可移植性,允许Unix在许多不同类型的计算机上轻松重新编译并加快其采用速度。C和Unix的命运联系在一起,C的受欢迎程度部分与Unix作为操作系统的成功有关。

    1978年,Brian Kernighan和Dennis Ritchie出版了一本名为“C编程语言”的书。这本书通常被称为K&R(以作者的姓氏命名),为该语言提供了非正式的规范,并成为事实上的标准。当需要最大的可移植性时,程序员会坚持K&R中的建议,因为当时的大多数编译器都是按照K&R标准实现的。

    1983年,美国国家标准协会(ANSI)成立了一个委员会,为C建立正式的标准。
    1989年(委员会需要永远做任何事情),他们完成了,并发布了C89标准,通常被称为ANSI C。
    1990年,国际标准化组织(ISO)采用了ANSI C(进行了一些小的修改)。这个版本的C被称为C90。编译器最终符合ANSI C/C90标准,并且希望获得最大可移植性的程序被编码为该标准。

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


  • C++

    C++(发音见加号)由贝尔实验室的Bjarne Stroustrup开发,作为C的扩展,从1979年开始。C++为C语言增加了许多新功能,也许最好将其视为C的超集,尽管这并不是严格正确的(因为C99引入了一些C++中不存在的功能)。C++声名鹊起主要是因为它是一种面向对象的语言

    C++于1998年由ISO委员会标准化(这意味着ISO标准委员会批准了一份描述C++语言的文件,以帮助确保所有编译器遵守同一套标准)。2003年发布了对该语言的次要更新(称为C++03)。

    从那时起,对C++语言进行了四次重大更新(C++11,C++14,C++17和C++20),每次都增加了额外的功能。特别是C++11增加了大量的新功能,并被广泛认为是该语言的新基线版本。该语言的未来升级预计将每三年左右进行一次,C++23的功能集已经开始制定。

    该语言的每个新的正式版本称为语言标准(或语言规范)。标准以发布年份命名。例如,没有C++15,因为2015年没有新标准。


  • C和C++的理念

    C和C++的基本设计理念可以概括为“信任程序员”——这既美妙又危险。C++旨在允许程序员高度自由地做他们想做的事情。然而,这也意味着语言通常不会阻止你做一些没有意义的事情,因为它会认为你这样做是出于某种它不理解的原因。新程序员如果措手不及,可能会陷入很多陷阱。这就是为什么知道在C/C++中不应该做什么几乎和知道你应该做什么一样重要的主要原因之一。

C++的特长:

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

  • 电子游戏
  • 实时系统
  • 高性能金融应用程序
  • 图形化应用程序和模拟
  • 生产力/办公应用
  • 嵌入式软件
  • 人工智能和神经网络

3、C++开发简介

在编写和执行第一个C++程序之前,我们需要更详细地了解C++程序是如何开发的。下图概述了一种简单的方法:(流程图在帮助我们写程序代码的时候也是十分有用的,记得我刚学习C语言的时候,老师最先教我们的就是如何去画流程图,以及单片机老师每次上实验课都十分强调的要画流程图)
在这里插入图片描述


1)定义要解决的问题

实际上我们的问题往往都是自己被动地接受的问题,您可以在其中找出要解决的问题。提出您想要编程的初始想法可能是最简单的步骤,也可能是最困难的步骤。但从概念上讲,它是最简单的。您所需要的只是一个可以很好地定义的想法,并且您已经为下一步做好了准备。

以下是一些示例:

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

2)确定如何解决问题

您可以在其中确定如何解决您在步骤1中提出的问题。这也是软件开发中最容易被忽视的步骤。问题的症结在于,有很多方法可以解决问题 - 但是,其中一些解决方案是好的,其中一些是坏的。很多时候,程序员会得到一个想法,坐下来,然后立即开始编写解决方案。这通常会生成属于不良类别的解决方案。(这里就体现出了学习算法以及一个优秀的算法的重要性


3)编写程序

为了编写程序,我们需要两件事:

首先,我们需要编程语言的知识。

其次,我们需要一个文本编辑器来编写和保存我们编写的程序。我们使用C++指令编写的程序称为源代码(通常缩写为代码)。可以使用任何您想要的文本编辑器编写程序,即使是像 Windows 的 记事本 或 Unixvipico 这样简单的东西。但是,我们强烈建议您使用专为编程而设计的编辑器(称为代码编辑器)。

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

  1. 行号
    当编译器给我们一个错误时,行号很有用,因为典型的编译器错误会指出:一些错误代码/消息,第64行。如果没有显示行号的编辑器,查找行 64 可能非常麻烦。

  2. 语法突出显示和着色
    语法突出显示和着色会更改程序各个部分的颜色,以便更轻松地识别程序的不同组件。下面是一个同时具有行号和语法突出显示的C++程序的示例:
    在这里插入图片描述

  3. 一种明确的字体
    非编程字体通常很难区分数字 0 和字母 O,或者数字 1、字母 l(小写 L)和字母 I(大写 i)之间的区别。一个好的编程字体将确保这些符号在视觉上是有区别的,以确保一个不会意外地代替另一个符号。默认情况下,所有代码编辑器都应启用此功能,但标准文本编辑器可能不会。


我们编写的C++程序源代码的后缀名通常是 .cpp.cpp 扩展名告诉编译器(和您)这是一个包含C++指令C++源代码文件。请注意,有些人使用扩展名 .cc 而不是 .cpp,但我们建议您使用 .cpp

  • 最佳实践:
    将代码文件命名为.cpp,其中某些内容是您选择的名称,.cpp是指示该文件是C++源文件的扩展名。

注: 许多复杂的C++程序具有多个.cpp文件。尽管您最初要创建的大多数程序只有一个.cpp文件,但可以编写具有数十或数百个.cpp文件的单个程序。一旦我们编写了程序,接下来的步骤是将源代码转换为我们可以运行的东西,然后看看它是否有效。


4)编译源代码

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

  • 首先,它会检查您的代码,以确保它遵循C++语言的规则。如果没有,编译器将为您提供错误(以及相应的行号),以帮助查明需要修复的内容。编译过程也将中止,直到错误得到修复。
  • 其次,它将 C++ 源代码转换为称为对象文件的 机器语言文件(二进制)。对象文件通常命名为 name.oname.obj,其中 name 与生成它 .cpp 文件的名称相同。

如果你的程序有三个.cpp文件,编译器将会生成 3 个对象文件:
在这里插入图片描述


5)链接对象文件和库

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

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

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

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

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

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

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


6)测试和调试

这是有趣的部分(因为我们可以看出我们所写的程序最后运行的结果,这是一个收获的过程,如果没有讨厌的Bug出现的话,希望如此),您可以运行可执行文件,并查看它是否产生您期望的输出。

如果您的程序运行但无法正常工作,那么是时候进行一些调试来找出问题所在了。


集成开发环境(IDE)

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

这里只进行几个经典的开发软件的推荐:(建议安装一个附带支持 C++17 的编译器的 IDE

  • Visual Studio 2019:宇宙无敌第一实至名归,但运行起来稍微有点麻烦,功能极其强大,恐怖如斯。
  • DEV C++:也是一款优秀、轻巧的C语言/C++开发软件,功能也很全,麻雀虽小,五脏俱全。
  • Visual Studio Code:在安装好插件的情况下,vscode也具有十分优秀的C语言编程能力。(参考教程: 在vscode中配置C++编程环境

就浅浅的推荐一下以上的 IDE。

  • ***要避免的 IDE

    您应该完全避免使用以下 IDE,因为它们不支持至少 C++11,根本不支持C++,或者不再主动支持或维护:
    • Borland Turbo C++:不支持 C++11
    • Visual Studio for Mac :不支持C++

当存在支持现代C++轻量级,免费的替代方案时,没有充分的理由使用过时或不受支持的编译器。


4、编写第一个程序

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

传统上,第一个用新语言编写的程序程序员是臭名昭着的 hello world 程序。
我所使用的是较为轻便的 vscode,新建程序的教程可以参考: 在vscode中配置C++编程环境


5、一些常见的C++问题

  • 常规运行时问题:在这里插入图片描述在这里插入图片描述


6、配置编译器:

1)编译器扩展

对于Visual Studio 2019用户:

若要禁用编译器扩展,请在“解决方案资源管理器”窗口中右键单击项目名称,然后选择“属性”:
在这里插入图片描述
在“项目”对话框中,首先确保“配置”字段设置为“所有配置”。

然后,单击“C/C++ >语言”选项卡,并将“一致性模式”设置为“是”(/允许-)。
在这里插入图片描述


2)提高警告级别

对于Visual Studio 2019用户:

若要禁用编译器扩展,请在“解决方案资源管理器”窗口中右键单击项目名称,然后选择“属性”:
在这里插入图片描述
在“项目”对话框中,首先确保“配置”字段设置为“所有配置”。

然后选择 C/C++ >常规选项卡,并将警告级别设置为级别 4 (/W4):
在这里插入图片描述
注: 请勿选择“启用所有警告”(/Wall),否则您将被埋没在C++标准库中生成的警告中。


3)选择语言标准

进行中语言标准的代码名称

最终确定的语言标准以最终确定的年份命名(例如.C++ 17于2017年最终确定)。

但是,当就新的语言标准达成一致时,尚不清楚最终确定将在哪一年进行。因此,进行中的语言标准被赋予代码名称,然后在标准最终确定后被实际名称取代。例如,C++11 在处理时被称为 c++1x。您可能仍然会看到某些地方使用的代码名称(特别是对于即将推出的语言标准版本,该版本还没有最终名称)。

下面是代码名称到最终名称的映射:

  • c++1x = C++11
  • c++1y = C++14
  • c++1z = C++17
  • c++2a = C++20
  • c++2b = C++23

例如,如果您看到 ,这是 C++17 语言标准的同义词。c++1z


如何选择语言标准

在专业环境中,通常选择一种语言标准,该标准是从最新标准回来的一个或两个版本(例如,现在C++20已经出来,这意味着C++14或C++17)。这样做通常是为了确保编译器制造商有机会解决缺陷,并且能够很好地理解新功能的最佳实践。在相关的情况下,这也有助于确保更好的跨平台兼容性,因为某些平台上的编译器可能无法立即提供对较新语言标准的完全支持。

建议您使用 C++20 语言标准(如果您的编译器支持),或者使用C++17语言标准也将提供良好的体验。


在Visual Studio中设置语言标准

Visual Studio 2019 默认为 C++14 功能,这不允许使用 C++17 和 C++20 中引入的较新功能。

  • 警告:
    使用 Visual Studio 2019,每次创建新项目时都需要重新选择语言标准。

若要选择语言标准,请打开项目,然后转到“项目”菜单>(应用程序的名称)“属性”,然后打开“配置属性”> C/C++ >语言”。
在这里插入图片描述
在这里插入图片描述

  • 提示:
    我们建议选择最新的标准“ISO C++最新 (/std:c++latest)”,截至撰写本文时,这是 C++20 支持的设置。
    更多信息请参考Microsoft提供的Visual Studio语言标准参考文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_oilpicture

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值