1.3 — 对象和变量简介

数据和值

在课程 1.1 -- 语句和程序结构 中,您了解到程序中的大多数指令都是语句,并且函数是按顺序执行的语句组。函数内的语句执行操作,这些操作(希望)会生成程序设计要产生的结果。

但是程序究竟是如何产生结果的呢?它们通过操纵(读取、更改和写入)数据来做到这一点。在计算中,数据是计算机可以移动、处理或存储的任何信息。

关键见解

程序是操纵数据以产生所需结果的指令集合。

计算机程序(无论是源代码格式还是编译后的)在技术上也是数据,因为它们可以被移动、处理和存储。然而,在计算机程序的上下文中,我们通常使用“代码”来指代程序本身,使用“数据”来指代程序用来产生结果的信息。

程序可以通过多种方式获取要处理的数据:从文件或数据库,通过网络,用户在键盘上提供输入,或者程序员将数据直接放入程序本身的源代码中。在前面提到的课程中的“Hello world”程序中,文本“Hello world!”被直接插入到程序的源代码中,为程序提供了数据。然后程序通过将其发送到显示器进行显示来操纵此数据。

在编程中,单个数据称为(有时称为数据值)。值的常见示例包括:

  • 数字(例如 5-6.7)。
  • 字符,用单引号括起来(例如 'H''$')。只能使用单个符号。
  • 文本,必须用双引号括起来(例如 "Hello""H")。文本可以包含 0 个或多个字符。

关键见解

用单引号括起来的值被编译器解释为字符值。
用双引号括起来的值被编译器解释为文本值。
数值不加引号。

直接放入源代码中的值称为字面量。我们将在课程 5.2 -- 字面量 中详细介绍字面量。

对值最常见的操作之一是将其打印到屏幕上。例如:

#include <iostream> // for std::cout

int main()
{
    std::cout << 5;       // print the literal number `5`
    std::cout << -6.7;    // print the literal number `-6.7`
    std::cout << 'H';     // print the literal character `H`
    std::cout << "Hello"; // print the literal text `Hello`

    return 0;
}

如果字符值或文本值没有正确引用,编译器会尝试将该值解释为 C++ 代码。这几乎总是会导致编译错误。

字面量是为程序提供值最简单的方法,但它们有一些缺点。字面量是只读值,因此它们的值无法修改。因此,如果我们要将数据存储在内存中,我们需要其他方法来做到这一点。

随机存取存储器

计算机中的主存储器称为随机存取存储器(通常简称为 RAM)。当我们运行程序时,操作系统将程序加载到 RAM 中。任何硬编码到程序本身的数据(例如“Hello, world!”之类的文本)都在此时加载。

操作系统还会为程序在运行时预留一些额外的 RAM。此内存的常见用途是存储用户输入的值、存储从文件或网络读取的数据,或存储程序运行时计算的值(例如两个值的和),以便以后可以再次使用。

您可以将 RAM 想象成一系列带编号的盒子,程序运行时可以用来存储数据。

在一些较旧的编程语言(如 Applesoft BASIC)中,您可以直接访问这些盒子(例如,您可以编写一个语句来“获取存储在内存盒编号 7532 中的值”)。

对象和变量

在 C++ 中,不鼓励直接内存访问。相反,我们通过对象间接访问内存。一个对象表示一块存储区域(通常是 RAM 或 CPU 寄存器),可以容纳一个值。对象还具有关联的属性(我们将在未来的课程中介绍)。

编译器和操作系统如何将内存分配给对象超出了本课程的范围。但这里的关键点是,我们不再说“去获取存储在邮箱号 7532 中的值”,而是可以说“去获取此对象存储的值”,让编译器自己找出在哪里以及如何检索值。这意味着我们可以专注于使用对象来存储和检索值,而不必担心这些对象实际上被放置在内存中的什么位置。

尽管 C++ 中的对象可以是未命名(匿名)的,但我们通常会使用标识符来命名我们的对象。一个有名称的对象称为变量

关键见解

对象用于在内存中存储值。变量是具有名称(标识符)的对象。

命名我们的对象使我们可以在程序中稍后再次引用这些对象。

命名法

在通用编程中,术语对象通常指内存中的未命名对象、变量或函数。在 C++ 中,术语对象的定义更窄,不包括函数。当我们在本教程系列中使用术语对象时,我们指的是这种更窄的 C++ 定义。

变量定义

为了在程序中使用变量,我们需要告诉编译器我们想要一个。最常见的方法是使用一种特殊的声明语句,称为定义(我们稍后将在课程 2.7 -- 前向声明和定义 中澄清声明和定义之间的区别)。

关键见解

定义语句可用于告诉编译器我们想在程序中使用一个变量。

这是一个定义名为 x 的变量的示例

int x; // define a variable named x (of type int)

编译时(程序被编译时),当遇到此语句时,编译器会记录下来,我们想要一个名为 x 的变量,并且该变量的数据类型是 int(稍后会详细介绍数据类型)。从那时起(在未来的课程中我们将讨论一些限制),每当我们在代码中使用标识符 x 时,编译器都会知道我们指的是这个变量。

编译器为我们处理所有关于这个变量的其他细节,包括确定对象需要多少内存,对象将放置在何种存储中(例如在 RAM 或 CPU 寄存器中),它相对于其他对象的位置,何时创建和销毁等等……

通过定义语句创建的变量,据说在定义语句所在的位置是已定义的。目前,您的变量应该定义在函数内部(例如在 main() 中)。

这是一个包含变量定义语句的完整程序

int main()
{
    int x; // definition of variable x

    return 0;
}

变量创建

运行时(当程序被加载到内存中并运行),每个对象都被赋予一个实际的存储位置(例如 RAM 或 CPU 寄存器),它可以用来存储值。为对象使用而保留存储的过程称为分配。一旦分配完成,对象就被创建并可以使用了。

举例来说,假设变量 x 在内存位置 140 实例化。每当程序使用变量 x 时,它将访问内存位置 140 中的值。

关键见解

一旦为对象的使用保留了实际存储空间,对象就被“创建”了。

当上述程序运行时,执行从 main() 的顶部开始。为 x 分配内存。然后程序结束。

数据类型

到目前为止,我们已经介绍了对象是存储区域,可以存储数据值(数据究竟如何存储是未来课程的主题)。数据类型(更常见地简称为类型)决定了对象将存储何种类型的值(例如数字、字母、文本等)。

在上面的例子中,我们的变量 x 被赋予了 int 类型,这意味着变量 x 将存储一个整数值。整数是可以在不带小数部分的情况下写入的数字,例如 4270-2-12。简而言之,我们可以说 x 是一个 整数变量

在 C++ 中,对象的类型必须在编译时已知,并且该类型不能在不重新编译程序的情况下更改。这意味着整数变量只能保存整数值。如果您想存储其他类型的值,您将需要使用不同的类型。

关键见解

对象的 数据类型 必须在编译时已知(这样编译器才知道该对象需要多少内存)。

整数只是 C++ 支持的众多内置类型之一。为了说明目的,这里是另一个使用 double 数据类型定义变量的示例

double width; // define a variable named width, of type double

C++ 还允许您创建自己的自定义类型。这是我们将在未来的课程中大量做的事情,这也是 C++ 强大的原因之一。

对于这些介绍性章节,我们将坚持使用整数变量,因为它们概念上很简单,但我们很快就会探索 C++ 提供的许多其他类型(包括 double)。

定义多个变量

可以通过用逗号分隔名称,在一个语句中定义多个相同类型的变量。以下代码片段

int a;
int b;

与此代码片段本质上相同

int a, b;

以这种方式定义多个变量时,新程序员往往会犯三个常见错误(都不严重,因为编译器会捕捉到这些错误并要求您修复它们)

第一个错误是在连续定义变量时给每个变量指定类型。

int a, int b; // wrong (compiler error)

int a, b; // correct

第二个错误是尝试在同一语句中定义不同类型的变量,这是不允许的。不同类型的变量必须在单独的语句中定义。

int a, double b; // wrong (compiler error)

int a; double b; // correct (but not recommended)

// correct and recommended (easier to read)
int a;
double b;

我们将在下一课讨论第三个问题,届时我们将介绍变量的初始化。

最佳实践

虽然语言允许这样做,但避免在单个语句中定义多个相同类型的变量。相反,在单独的语句中,每行定义一个变量(然后使用单行注释来记录其用途)。

总结

在 C++ 中,我们使用对象来访问内存。一个命名的对象称为变量。每个变量都有一个标识符、一个类型和一个值(以及一些不相关的其他属性)。变量的类型用于确定内存中的值应该如何解释。

变量实际上是在运行时创建的,当为其使用分配内存时。

在下一课中,我们将探讨如何为变量赋值以及如何实际使用它们。

小测验时间

问题 #1

什么是数据?

显示答案

问题 #2

什么是值?

显示答案

问题 #3

什么是对象?

显示答案

问题 #4

什么是变量?

显示答案

问题 #5

什么是标识符?

显示答案

问题 #6

数据类型是用来做什么的?

显示答案

问题 #7

什么是整数?

显示答案

guest
您的电子邮箱地址将不会被显示
发现错误?请在上方留言!
与勘误相关的评论在处理后将被删除,以帮助减少混乱。感谢您帮助使网站对每个人都更好!
来自 https://gravatar.com/ 的头像与您提供的电子邮箱地址相关联。
有回复时通知我:  
729 条评论
最新
最早 最多投票
内联反馈
查看所有评论