1-3 对象与变量介绍
数据与值
在第1.1课——语句与程序结构中,你了解到程序中的大多数指令是语句,而函数则是按顺序执行的语句集合。函数内部的语句执行操作,这些操作(理想情况下)会产生程序设计时预期的结果。
那么程序如何实际产生结果?其原理在于对数据进行操作(读取、修改和写入)。在计算机领域,数据data指任何可被计算机移动、处理或存储的信息。
关键洞见:
程序是由指令组成的集合,通过操作数据来产生预期结果。计算机程序(无论是源代码形式还是编译后的形式)从技术上讲也是数据,因为它们可以被移动、处理和存储。然而,在计算机程序的语境中,我们通常用“代码”指代程序本身,用“数据”指代程序为产生结果而处理的信息。
程序获取数据的方式多种多样:可从文件或数据库中读取,通过网络获取,接收用户键盘输入,或由程序员直接将数据写入程序源代码。在前文“Hello world”示例程序中,文本“Hello world!”被直接嵌入源代码,为程序提供了可用的数据。程序随后通过将数据发送至显示器进行处理以实现输出。
在编程中,单个数据单元称为值value(有时也称数据值data value)。常见的值类型包括:
- 数字(如5或-6.7)。
- 字符,需用单引号括起(如'H'或'$')。仅允许使用单个符号。
- 文本,必须用双引号括起(如“”Hello“‘或’”H“”)。文本可包含零个或多个字符。
关键要点:
用单引号包裹的值会被编译器解释为字符值。
用双引号包裹的值会被编译器解释为文本值。
数值无需加引号。
直接写入源代码的值称为字面量literals。我们在第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++代码。这几乎总会导致编译错误。
常量是为程序提供值的最简单方式,但存在某些局限性。常量属于只读值,其值无法被修改。因此,若需将数据存储在内存中,我们需要采用其他方法实现。
随机存取存储器
计算机的主存储器称为随机存取存储器Random Access Memory(通常简称为RAMRAM)。当我们运行程序时,操作系统会将程序加载到RAM中。任何硬编码在程序本身中的数据(例如文本“Hello, world!”)都会在此阶段加载。
操作系统还会为程序运行预留额外的RAM空间。这类内存通常用于存储用户输入的值、从文件或网络读取的数据,以及程序运行过程中计算出的临时结果(如两个数值的和),以便后续调用。
可将RAM视为一组编号存储单元,用于在程序运行期间存储数据。
在某些早期编程语言(如Applesoft BASIC)中,可直接访问这些存储单元(例如编写语句“获取存储在编号7532存储单元中的值”)。
对象与变量
在C++中,不鼓励直接访问内存。相反,我们通过对象间接访问内存。对象object代表一个存储区域(通常是RAM或CPU寄存器),能够保存数值。对象还具有关联属性(我们将在后续课程中讲解)。
编译器和操作系统如何为对象分配内存超出了本课的讨论范围。但关键在于:我们无需指定“从7532号邮箱获取值”,只需说“获取此对象存储的值”,编译器自会确定取值位置与方式。这意味着我们可以专注于用对象存储和检索值,无需关心对象在内存中的实际位置。
尽管C++中的对象可以是无名的(匿名),但我们通常会使用标识符为对象命名。具有名称的对象称为变量variable。
关键要点:
对象用于在内存中存储值。变量是具有名称(标识符)的对象。为对象命名使我们能在程序后续部分再次引用这些对象。
命名法:
在一般编程中,术语“对象”通常指内存中的未命名对象、变量或函数。而在C++中,“对象”的定义更为狭窄,不包含函数。在本教程系列中使用“对象”一词时,我们指的就是这种更狭义的C++定义。
变量定义
要在程序中使用变量,我们需要告知编译器需要创建该变量。最常见的方式是使用一种特殊的声明语句——定义definition(关于声明与定义的区别,我们将在后续章节2.7 向声明与定义 中详细说明)。
关键要点:
定义语句可用于告知编译器,我们在程序中需要使用某个变量。
以下是定义名为 x 的变量的示例:
int x; // define a variable named x (of type int)
在编译时compile-time(即程序被编译的过程中),当遇到这条语句时,编译器会记录下我们需要一个名为x的变量,且该变量具有int数据类型(稍后将详细说明数据类型)。此后(除后续课程将讨论的某些限制外),每当我们在代码中使用标识符x时,编译器便会识别这是对该变量的引用。
编译器会自动处理该变量的所有细节,包括:确定对象所需内存大小、存储位置(如RAM或CPU寄存器)、相对于其他对象的存储关系、创建与销毁时机等。
通过定义语句创建的defined变量,其作用域始于定义语句所在的位置。目前建议将变量定义在函数内部(如main()函数中)。
以下是一个包含变量定义语句的完整程序示例:
变量创建
在运行时runtime(即程序被加载到内存并执行时),每个对象都会被分配一个实际存储位置(如RAM或CPU寄存器),用于存储值。为对象预留存储空间的过程称为分配allocation。一旦完成分配,对象即被创建并可供使用。
举例说明:假设变量x在内存地址140处实例化。程序每次使用变量x时,都会访问内存地址140处的值。
关键洞察:
当为对象实际分配存储空间时,该对象即被“创建”。
运行上述程序时,执行从 main() 函数顶部开始。程序为变量 x 分配内存后即结束。
数据类型
迄今为止,我们已了解对象是能够存储数据值的存储区域(数据的具体存储方式将在后续课程中讲解)。数据类型data type(通常简称为类型type)决定了对象将存储何种类型的值(例如数字、字母、文本等)。
在上例中,变量 x 被赋予类型 int,这意味着变量 x 将存储整数值。整数integer是指无需小数部分即可书写的数字,例如 4、27、0、-2 或 -12。简而言之,我们可以称 x 为整数变量。
在C++中,对象的类型必须在编译时确定,且类型变更需重新编译程序。这意味着整型变量只能存储整数值。若需存储其他类型值,则必须使用不同类型。
关键洞察:
对象的数据类型必须在编译时已知(以便编译器了解该对象所需的内存大小)。
整数只是C++开箱即用的众多数据类型之一。为便于说明,下面再举一个使用double数据类型定义变量的示例:
double width; // define a variable named width, of type double
C++还允许你创建自己的自定义类型。这在后续课程中我们将频繁使用,也是C++强大功能的重要组成部分。
在本入门章节中,我们将专注于整数变量,因为它们概念简单易懂,但很快就会探索C++提供的其他多种类型(包括双精度类型)。
定义多个变量
可以在单个语句中通过用逗号分隔名称来定义多个相同类型的变量。以下代码片段:
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
什么是值?
显示答案
值可以是字母(例如 a)、数字(例如 5)、文本(例如 Hello),或是其他可作为数据表示的有用概念的实例。
问题 #3
什么是对象?
显示答案
对象是存储区域(通常是内存),能够存储值。
问题 #4
什么是变量?
显示答案
变量是一个具有名称的对象。
问题 #5
什么是标识符?
显示答案
标识符是访问变量时使用的名称。
问题 #6
数据类型有什么用途?
显示答案
数据类型决定了对象将存储何种类型的值(例如数字、字母、文本等)。
问题 #7
什么是整数?
显示答案
整数是指可以不带小数部分书写的数。

浙公网安备 33010602011771号