目录
第一章 预备知识
1.1C++简介
- C++是在C语言的基础上添加了面向对象编程和泛型编程。
- C++的面向对象的特性带来了全新的编程方法,这种方法是应付复杂程度不断提高的现代编程任务而设计的。(面向对象编程:OOP)
- C++的模板特性提供了另一种全新的编程方法,泛型编程。
- 面向对象的编程(OOP)及其支持的新术语——对象、类、封装、数据隐藏、多态和继承等。
- C++融合了3种不同的编程方式:C语言是代表的过程性语言、C++在C语言的基础上添加的类代表的面向对象语言、C++模版支持的泛型编程。
(类的解释:和结构体struct类似,是一种用户自定义的数据类型,是有成员变量(属性)和成员函数(方法)所组成。)
1.1.1补充内容
在编程和计算机科学中,类(Class)、对象(Object)和属性(Attribute)是面向对象编程(Object-Oriented Programming, OOP)的核心概念。以下是它们的定义和作用:
1. 类(Class):
- 类是一种用户定义的引用数据类型,它描述了具有相同属性和方法的对象的蓝图或模板。
- 它定义了数据的组织方式(属性)和可以对这些数据执行的操作(方法)。
- 类可以被看作是对象的模板,它封装了数据和操作这些数据的函数。
2. 对象(Object):
- 对象是根据类创建的实例,它具有类定义的所有属性和方法。
- 每个对象都拥有自己的状态(属性值)和行为(方法)。
- 对象是类的实体,是类的具体化,可以创建多个对象实例,每个实例都有自己的属性值,但是它们共享相同的方法。
3. 属性(Attribute):
- 属性是类中定义的变量,用于存储对象的状态信息。
- 它们是对象的特征或特性,描述了对象的属性和状态。
- 例如,在一个 `Car` 类中,属性可能包括 `make`(制造商)、`model`(型号)和 `year`(年份)。
面向对象编程的这些概念允许开发者将现实世界中的事物抽象为计算机程序中的模型,通过封装、继承和多态等特性来组织和管理代码,使得软件设计更加模块化、灵活和可重用。举个例子,如果我们有一个 `Car` 类,它可能包含以下属性和方法:
class Car {
public:
std::string make; // 制造商
std::string model; // 型号
int year; // 年份
// 构造函数
Car(std::string m, std::string mo, int y) : make(m), model(mo), year(y) {}
// 方法:启动汽车
void start() {
std::cout << "The car is starting." << std::endl;
}
// 方法:停止汽车
void stop() {
std::cout << "The car is stopping." << std::endl;
}
};
在这个例子中,`Car` 是一个类,它有两个属性(`make` 和 `model`)和两个方法(`start` 和 `stop`)。如果我们创建一个 `Car` 类的对象,如下所示:
Car myCar("Toyota", "Corolla", 2020);
这里,`myCar` 就是一个 `Car` 类的对象,它具有类定义的属性和方法。我们可以通过 `myCar` 来访问这些属性和方法,例如 `myCar.start()` 来启动汽车。
这里的对象就是类的一个实例,这我理解的。
书上面是这样写的:
虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但它在编写大型程序时,仍面临着挑战。为应付这种挑战,OOP提供了一种新方法。与强调算法的过程性编程不同的是,OOP强调的是数据。OOP不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。其理念是设计与问题的本质特性相对应的数据格式。
1.1.2面向对象编程
在 C++中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。例如,类可以描述公司管理人员的基本特征(姓名、头衔、工资、特长等),而对象则代表特定的管理人员(Guilford Sheepblat、副总裁、$925 000、知道如何恢复 Windows 注册表)。通常,类规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。例如,假设正在开发一个能够绘制矩形的计算机绘图程序,则可以定义一个描述矩形的类。定义的数据部分应包括顶点的位置、长和宽、4 条边的颜色和样式矩形内部的填充颜色和图案等;定义的操作部分可以包括移动、改变大小、旋转、改变颜色和图案、将矩形复制到另一个位置上等操作。这样,当使用该程序来绘制矩形时,它将根据类定义创建一个对象。该对象保存了描述矩形的所有数据值,因此可以使用类方法来修改该矩形。如果绘制两个矩形,程序将创建两个对象,每个矩形对应一个。
OOP程序设计方法首先设计类,它们准确地表示了程序要处理的东西。例如,绘图程序可能定义表示矩形、直线、圆、画刷、画笔的类。类定义描述了对每个类可执行的操作,如移动圆或旋转直线。然后您便可以设计一个使用这些类的对象的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫作自下向上(bottom-up)的编程。
OOP编程并不仅仅是将数据和方法合并为类定义。例如,OOP还有助于创建可重用的代码,这将减少大量的工作。信息隐藏可以保护数据,使其免遭不适当的访问。多态让您能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。继承让您能够使用旧类派生出新类。正如接下来将看到的那样OOP引人了很多新的理念,使用的编程方法不同于过程性编程。它不是将重点放在任务上,而是放在表示概念上。有时不一定使用自上向下的编程方法,而是使用自下向上的编程方法。面向对象编程:定义、特点、应用场景、优缺点及示例代码-CSDN博客
1.1.3泛型编程
泛型编程是C++支持的另一种编程模式,它与OOP的目标相同,即使重用代码和抽象通用概念的技术更简单,而OOP强调的是编程的数据方面,泛型编程强调是独立于特定的数据类型。
数据类型是编程语言中用于定义变量所存储数据的类型的一个分类。每种数据类型都规定了变量可以存储的数据的种类以及可以对这些数据执行的操作。数据类型对于编程至关重要,因为它们决定了如何将数据存储在内存中,以及如何对数据进行操作和解释。
以下是一些常见的数据类型:
-
整数类型:用于表示没有小数的数值,如:
int
(整型)、short
(短整型)、long
(长整型)等。 -
浮点类型:用于表示有小数的数值,如:
float
(单精度浮点型)、double
(双精度浮点型)等。 -
字符类型:用于表示单个字符,如:
char
。 -
布尔类型:表示逻辑值,即真(true)或假(false),如:
bool
。 -
字符串类型:用于表示文本数据,通常由字符序列组成,如:
string
。 -
枚举类型:用于表示一组命名的常量,如:
enum
。 -
结构体类型:允许将不同的数据类型组合成一个单一的数据结构,如:
struct
。 -
联合类型:与结构体类似,但在同一时间内只能存储一个成员的值。
-
指针类型:用于存储变量的内存地址,如:
int*
表示整型的指针。 -
数组类型:用于存储固定大小的同类型元素的集合,如:
int array[10]
。 -
类类型:在面向对象编程中,类类型用于创建对象,如:
class
。
每种编程语言都有其自己的数据类型系统,但大多数语言都提供了上述类型的变体或等价物。正确选择和使用数据类型对于确保程序的正确性、效率和可维护性至关重要。数据类型也影响着程序的内存使用,因为不同类型的变量占用不同大小的内存空间。
OOP 关注的是数据(对象的状态)和操作数据的方法,而泛型编程关注的是如何编写与数据类型无关的代码,使得代码更加通用和灵活。泛型编程允许你编写出可以在多种类型上工作的代码,而不需要针对每种类型编写特定的逻辑。这样,你可以用同一段代码处理整数、字符串、自定义对象等不同的数据类型。
1.2程序创建的技巧
1.2.1 g++编译
这里使用的是g++进行编译的过程:
1.2.2C++ 编译器介绍
MSVC,GCC和Clang是业界三种最主流的C/C++编译器,下面粗劣比较一下他们的差异:
1.2.2.1MSVC
- MSVC(Microsoft Visual C++)由微软开发,主要用于Windows平台应用程序的开发。
- Visual Studio系列IDE默认集成了该编译器,可以通过下载安装Visual Studio安装包来安装。
- MSVC只能在Windows下用,不支持跨平台。
1.2.2.2 GCC
GCC
最开始的原名是GNU C Compiler
,是GNU项目的C语言编译器。后来逐步拓展支持了更多的语言,支持编译C、C++、Fortran、Pascal、Objective-C、Java、Ada、Go等,所以变成了GNU Compiler Collection
(GNU编译器套装),是一套由GNU项目开发的支持多种编程语言的编译器工具链。
GNU(GNU’s Not Unix)是一个自由操作系统项目,名字是一个递归的 GNU’s Not Unix 缩写,其目标是创建一个类Unix的操作系统。
GNU工具: GNU项目开发了一系列标准的系统工具,如文本编辑器(Emacs)、编译器(GCC)、调试器(GDB)等。这些工具在许多Unix-like系统上广泛使用。
GCC支持多种平台和操作系统,包括Linux、Windows、macOS等,并且是许多开源项目和操作系统的标准编译器,如Linux内核。GCC还支持多种CPU指令集架构,如:X86、ARM等。
(1) GCC的主要优点
- 支持多语言: 支持多种编程语言,如C、C++、Fortran、Pascal、Objective-C、Java、Ada、Go等。
- 跨平台性: GCC编译器能够在不同的操作系统和硬件平台上编译和运行代码,确保了代码的高度可移植性。
- 性能优化: GCC编译器内置了多种优化策略,可以根据不同的编译选项进行代码优化,从而提升程序的运行效率。
- 功能丰富: 编译时可生成调试信息,便于开发者进行调试。并提供了广泛的编译选项和扩展功能,以满足不同开发者的需求。
(2) GCC的常用工具
工具 | 描述 |
---|---|
gcc | GCC的主要编译器,用于将源代码编译为可执行文件或库。支持多种语言(如C、C++、Fortran等),并提供丰富的编译选项。 |
g++ | GCC的C++编译器,用于将C++源代码编译为可执行文件或库。与gcc共享许多相同的编译选项,同时支持针对C++的特定选项。 |
gdb | GCC附带的调试器,用于调试程序。允许在程序运行时设置断点、单步执行代码、查看变量值等。支持多种编程语言,提供强大的调试功能。 |
objdump | 用于反汇编目标文件或可执行文件,显示二进制文件的汇编代码。还可显示符号表信息、重定位表等相关信息。 |
nm | 用于列出目标文件或可执行文件中的符号表。显示函数、变量以及其他符号的名称和地址。 |
ar | 用于创建、修改和提取静态库文件。允许将多个目标文件打包成一个库文件,以便在编译时链接使用。 |
size | 用于查看目标文件或可执行文件的大小信息。显示代码段、数据段和符号表等各部分的大小统计。 |
readelf | 用于显示ELF(Executable and Linkable Format)格式的二进制文件的详细信息。显示段表、符号表、动态链接信息等。 |
1.2.2.3 MinGW
MinGW(Minimalist GNU for Windows)是一个用于Windows平台的开发环境,它提供了GNU编译器集合(GCC)的Windows版本。MinGW允许开发者在Windows上使用GCC编译器来编译C、C++和其他支持的语言。MinGw只支持32位Widnows系统,MinGW-w64 支持32位和64位。所以现在说MinGW时,一般默认指的MinGW-w64,见 MinGW官网。
主要特点:
- GCC编译器: MinGW包含了GCC编译器,支持C、C++、Fortran等语言。
- 跨平台开发: 开发者可以使用MinGW编译的程序在Windows上运行,同时保持与Linux和其他Unix-like系统的兼容性。
- 开源: MinGW是开源的,遵循GNU通用公共许可证(GPL)。
- 轻量级: MinGW提供了一个轻量级的开发环境,不需要复杂的安装和配置。
1.2.3创建源代码文件
有些C++实现(如Microsoft Visual C++、Embarcadero C++ Builder、Apple Xcode等)提供了集成开发环境(integrated development environments,IDE),能够让你在主程序中管理程序开发的所有步骤,包括编辑。
有些实现(如用于UNIX和Linux的GNU C++、用于AIX的IBM XL C/C++等编译器)只能处理编译和链接阶段,要求在系统命令行输入命令。
给源文件命名时候,必须使用正确的后缀,将文件表示为C++文件,这不仅告诉您该文件为C++源代码,还将这种信息告知编译器。后缀由一个句点和一个或多个字符组成,这些字符被叫做扩展名。
1.2.4编译和链接
1.2.4.1 UNIX的编译和链接
最初的时候对于C++程序的编译是通过使用了一个C++到C的编译器程序,而不是开发直接的C++到目标代码的编译器。前者叫做cfront,但是cfront未能紧跟C++发展的步伐,目前使用编译器可能是商业的,也有可能是自由软件,如GNU g++编译器。如果UNIX计算机上有C++编译器,很多情况下命令CC仍然管用,但是对于下述讨论的CC,可能必须使用其他命令代替。
1.2.4.2 Liunx编译和链接
1.2.4.3 Windows命令行编译和链接
1.2.4.4 Windows编译器
1.2.4.5 macintosh上的C++
apple随操作系统MAC OS X提供了开发框架Xcode,该框架是免费的,但是不会自动安装。要安装它,可使用操作系统安装盘。Xcode不仅提供了支持多种语言的IDE,还自带了两个命令行编译器(g++和clang),可在UNIX模式下运行它们。
第二章 开始学习C++
2.1 进入C++
程序清单2.1使用C++工具cout生成字符输出。
源代码中包含一些供读者阅读的注释,这些注释都以//打头。
C++对于大小写敏感,就是说区分大小写。这意味着大小写必须和实例的相同,例如该程序使用的是cout,如果将其替换成Cout或者COUT,程序将无法通过编译。并且编译器将指出使用了未知的标识符(编译器也是对于编写敏感的,因此请不要用kout或coot),文件扩展名cpp是一种表示C++程序的常用方式。
-----------------------------------------学习补充内容1--程序调整-----------------------------------------------
一种是让程序一直开着,一种是让程序弹窗一次就结束。
---------------------------------学习补充内容2--C语言输入和输出-------------------------------------
如果已经使用过C语言进行编程,则看到cout函数(而不是【printf()函数】时可能会小吃一惊),事实上,C++能够使用printf(),scanf()和其他所有标准C输入和输出函数,只需要包含常规的C语言的stdio.h文件。不过本书介绍的是C++程序,所以将使用C++的输入工具,他们在C版本的基础上作了很多改进。
您使用函数来创建C++程序。通常,先将程序组织为主要任务,然后设计独立的函数来处理这些任务,程序清单2.1上图中的示例非常简单,只包含了一个名为main()的函数,myfirst.cpp示例包含下述元素。
- 注释,由前缀//标识。
- 预处理器编译指令#include
- 函数头int main()
- 编译指令 using namespace
- 函数体,用{ 和 }括起
- 使用C++的cout工具显示消息的语句
- 结束main()函数的return语句
2.1.1 main函数
C++中,每条完整的指令都称为语句。所有的语句都以分号结束。
第一行的 int main()叫做函数头(function heading);函数头对于函数与程序的其他部分之间的接口进行了总结;
花括号({和})中包含的部分叫函数体。函数体是指出函数应做什么的计算机指令。
main()中最后一条叫做返回语句(return statement),他结束该函数。
-------------------------学习补充内容3--语句和分号------------------------------------------------
语句是要执行的操作,为理解源代码,编译器需要知道一条语句何时结束,另外一条语句何时开始。有的语言使用语句分隔符。
在C++中使用的终止符(terminator),而不是分隔符。终止符是一个分号。
1.作为接口的函数头
C++句法要求main()函数的定义以函数头 int main()开始。
- 通常C++函数可能被其他函数激活或调用,函数头描述了函数与调用它的函数之间的接口,位于函数名前面的部分叫做函数的返回类型,它描述的从函数返回给调用它的函数的信息。
- 函数后括号中的部分叫做形参列表(argument list)或者参数列表(parameter list);它描述的是从调用函数传递给被调用的函数的信息。
- 这种通用格式通常不用于main(),通常不从程序的其他的地方调用main()。
- 然而 main()被启动代码调用,而启动代码是由编译器添加到程序中,是程序和操作系统(UNIX、windows 7或者其他操作系统)之间的桥梁。事实上,函数头描述的是main()和操作系统之间接口。--一般情况下全局变量和全局函数的初始化会在main函数之前被执行。
- main()函数的接口描述,该接口从int开始,C++函数可以给调用函数返回一个值,这个值叫做返回值(return value)。从关键字int可知,main()返回一个整数值。
- 然后是空括号,C++函数在调用另一个函数时,可以将信息传递给该函数,括号里面的函数头的部分描述的就是这种信息。空括号表示main()函数不接受任何信息或者任何参数。
- 下面的内容是一些例子和具体的用法:
2.为什么main()不能使用其他名称
通常C++程序中必须包含一个名为main()的函数,这个例子中只有一个cpp文件,在运行C++程序,通常从main()函数处开始执行。
但是也存在一些特殊情况,比如windows中的动态链接库DLL,这是其他windows程序可以使用的代码。用于机器人的操作芯片可能是不需要的。
2.1.2 C++注释
C++以//打头,到行尾结束。注释可以位于单独的一行,也可以与代码位于同一行。源文件的扩展名取决于所用的C++系统,在其他系统中,文件名可能为myfirst.C或者myfirst.cxx。
C的注释为/* */之间的内容。
2.1.3 C++预处理器和iostream文件
如果程序要使用C++输入或输出工具,请提供这样的两行代码:
#include <iostream>
using namespace std;
可使用其他代码代替第2行, 这里使用这行代码旨在简化该程序(如果编译器不接受这几行代码,说明他没有遵守C++ 98标准)。
C++和C一样,也使用一个预处理器,该程序在进行主编译之前对源文件进行处理(第一章介绍过,有些C++实现使用翻译器程序将C++程序转换成C程序。虽然翻译器也是一种预处理器,但是这里只说明这样的预处理器处理以#开头的编译指令,不必执行任何特殊的操作来调用该预处理器,它会在编译程序时候自动运行)。
#include <iostream>
该编译指令导致预处理器将iostream文件的内容添加到程序中,这是一种典型的预处理器操作:在源文件被编译之前,替换或者添加文本。
这提出了一个问题:为什么要将iostream 文件的内容添加到程序中呢?答案涉及程序与外部世界之间的通信。iostream 中的(io)指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。C++的输入/输出方案涉及 iostream 文件中的多个定义。为了使用 cout 来显示消息,第一个程序需要这些定义。#include实际上,iostream 文件的内编译指令导致 iosteam 文件的内容随源代码文件的内容一起被发送给编译器。容将取代程序中的代码行#include <iostream>。原始文件没有被修改,而是将源代码文件和iostream 组合成一个复合文件,编译的下一阶段将使用该文件。
注意:使用cin和cout进行输入和输出的程序必须包含文件iostream。
2.1.4 头文件名
- 像iostream这样的文件叫做包含文件(include file)——由于他们被包含在其他文件中:也叫做头文件(header file)——由于他们被包含在文件的起始处。C++编译器自带了很多的头文件,每个头文件都支持一组特定的工具。
- C语言的传统是使用扩展名h,将其作为一种通过名称标识文件类型的简单方式。例如,头文件math.h支持各种C语言数学函数。
- C++算法变了,对于老式C的头文件保留了扩展名h(C++仍然可以使用这种文件),而C++头文件没有扩展名。有些C头文件被转换成C++头文件,这些文件被重新命名,去掉了扩展名h,(使之成为C++的风格),并在文件名称前面加上前缀c(表明来自c语言)。例如,C++版本的math.h为cmath。
- 对于纯粹的C++头文件(如iostream)来说,去掉h不只是形式上的变化,没有h的头文件也可以包含名称空间,下表对于头文件的命名约定进行了总结。
2.1.5 名称空间
- 名称空间支持是一项C++特性,旨在让您编写大型程序以及将多个厂商现有的代码组合起来的程序时候更容易,它还有助于组织程序。(用于多个产品/程序中区分相同的函数)
- 有的时候可以对于std的名称空间进行省略。比如对于cin和cout,借助于using编译指令。
2.1.6 使用cout进行C++的输出
- cin是从键盘的输入内容
- 对于myfirst.cpp程序中使用下面的C++语句:
cout <<"Come up and C++ me some time.";
- 双括号括号的一系列字符的字符串。因为它是由若干个字符组合而成的。
- <<符号表示该语句将把这个字符串发送给cout;该符号表示的是信息流动的路径,和2.3.1的cin和>>相对应使用。
- cout是一个预定义的对象,知道如何显示字符串、数字和单个字符等(对象是类的特定实例,而类定义了数据存储(属性)和使用方式(方法))
- cout对象有一个简单的接口,如果string是一个字符串,则下面的代码将显示该字符串:
cout << string ;
从概念上面看,输出是一个流,即从程序中流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的。
cout的对象属性包括一个插入运算符(<<),它可以表示将右侧的信息插入到流中(注意结尾的分号)。
cout << "Come up and C++ me some time.";
它将字符串come....time.插入到输出流中,与其说程序显示了一条消息,不如说它将一个字符串插入到了输出流中。
--------------------------------------- 学习补充内容4---初识运载符----------------------------------------
- 新定义运算符的含义。
- 主要是控制符endl和换行符\n的使用介绍和对比,对于cout输出的从前一个末尾开始;\n无法实时的显示输出,可能需要您输入信息后才会显示。具体的内容见下图。
2.1.7 C++源码的格式化
- 有些语句是面向行的,即每个语句占一行;回车的作用即将这些语句分开。
- 在C++中,分号标示了语句的结尾。因此在C++中,回车的作用就和空格或者制表符相同。故在C++中,通常可以在能够使用回车的地方使用空格。
- 因此说明可以把一条语句放在几行,也可以把多条语句放在一行 。
#include<iostream>
int
main
(){ using
namespace
std; cout
<<
"Come up and C++ me some time."
; cout<<
endl; cout<<
"You won't regret it!"<<
endl; return_0;
}
上面的代码虽然是不太好看,但是仍然是合法的格式。
必须遵守的一些规则是在C和C++中,1.不能把空格、制表符或回车放在元素(比如名称)中间;
2.也不能把回车放在字符串中间,见下图所示。
然而C++11新增的原始代码也包含回车。
-
(1)源代码中标记和空白
一行代码中不可分割的元素叫做标记(token,参见下图)。通常,必须用空格、制表符或回车将两个标记分开,空格、制表符和回车统称为空白(white space)。有些字符(如括号和逗号)是不需要用空白分开的标记。
return 0;// INVALID, must be return 0;
return(0);// VALID, white space omitted
return (0);// VALID, white space used
int main()// VALID, white space omitted in()
int main ()// ALSO VALID, white// VALID, white space used in()
-
(2)C++源代码风格
多数程序员遵循以下的风格:
- 每条语句占一行
- 每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行。
- 函数中的语句都相对于花括号进行缩进。
- 与函数名称相关的圆括号周围都没有空白。
前三条规则旨在确保代码清晰可读,第四条规则帮助区分函数和一些也使用圆括号的C++内置结构。
2.2 C++语句
C++程序是一组函数,而每个函数又是一组语句。
C++有好几种语句,下列程序提供了两种新的语句。
1.声明语句创建变量;
2.赋值语句给该变量提供一个值。
空行将声明语句和程序的其他部分分开。这是C常用的方法,但在C++中不那么常见。
2.2.1声明语句和变量
计算机是一种精确的、有条理的机器,要将信息想存储在计算机中,必须指出信息的存储位置和所需的内存空间。
在C++中是通过使用声明语句来实现,来指出存储类型并提供位置标签,简称为声明,例如:
int carrots;
包含两项信息:需要的内存和该内存单元的名称。
这条语句指出程序需要足够的存储空间来存储一个整数,int表示整数,而编译器负责分配和标记内存的细节。
完成的第二项是给存储单元指定名称,该声明语句指出,此后程序将使用名称carrots来标识存储在该内存单元中的值。
carrots是变量,因为他的值可以修改,在C++中所有的变量都需要声明。
声明不分配内存,定义才分配内存。
声明的具体实例分析(为什么变量必须声明):
声明通常指出了要存储的数据类型和程序对存储在这里的数据使用的名称。这里,程序将创建一个名为carrots的变量,他可以存储整数。
程序中的声明语句叫做定义声明(defining declaration)语句,简称为定义(defining)。
这意味着导致的编译器为变量分配空间。
其他地方还可能有引用声明。
这些声明命令计算机使用在其他地方的定义的变量。通常情况下声明不一定是定义,但是在这个问题里面,声明就是定义。
一般情况下变量的声明应该是放在首次使用变量的时候。但是在C++中不是所有的变量声明都位于函数或过程的开始位置。
2.2.2 赋值语句
- 赋值语句将值赋给存储单元;
- C++(和C)可以连续使用赋值运算符。
- 赋值将从右到左运行。
- 赋值语句可以对于变量的值进行修改。
carrots=carrots-1
右侧的为一个算术表达式,先计算得到结果,然后使用赋值运算符将新值存储到变量carrots对应的内存单元中。