C++ 变量

写程序离不开处理各种各样的数据,比如用户的年龄、考试的分数、商品的数量等。这些数据不仅需要保存在程序里,还会随着程序的运行不断发生变化。那么,C++ 程序是怎么记住并管理这些数据的呢?这就需要用到 “变量”。

C++ 变量是什么?

学习一门编程语言,最先要了解的就是词汇。就像学英语一样,我们得先弄清楚每个单词是什么意思,才能看懂整句话在说什么。学习 C++ 也是如此,我们先来看一行简单的代码:

int age = 20;

上面这行代码就相当于 C++ 中的 “一句话”,我们称之为 “语句”,行尾的英文分号(;)表示这一条语句结束了。在 C++ 中,变量指的是一个 “值可以改变的量”。简单来说,变量就像是给数据起了一个名字,方便我们在程序里随时找到并使用它。

这行代码一共包含了以下 3 个部分:

  • int:数据类型,表示这个变量用来保存整数(integer)。
  • age:变量名,也就是我们给这个变量起的名字。
  • 20:初始值,也就是当前保存在这个变量里的具体数值。

想要使用一个变量,我们就得先给它起一个名字,就像每个人都有自己的名字一样。当程序后面需要使用这个数据时,直接写出变量名 age 就可以了,总不能对计算机说:“喂,我要用刚才那个整数”。程序里的变量那么多,计算机怎么知道你要用哪一个呢?

变量的名字一般是不会变的,但它里面保存的值却可以随时改变。这就像人一样,名字通常是固定下来的,但每个人的年龄都会从 20 岁慢慢增长到 21 岁、30 岁,如下图所示。

变量名固定与变量值可变的区别

需要注意的是,C++ 是一门静态类型语言,每个变量在定义时都必须明确指定数据类型,并且一旦确定就不能再改变。比如把 age 定义为 int 整型之后,后面重新赋值时也只能用来保存整数,这一点跟 Python、JavaScript 等自动识别类型的语言不同。

另外,变量名也不是随便乱起的,比如不能以数字开头,也不能包含空格。完整的命名规则我们会在后面的 “C++ 标识符” 一节中展开介绍,现阶段先使用简单的英文单词起名即可。

C++ 变量的定义与初始化

在 C++ 中,使用变量必须遵循 “先定义,后使用” 的原则。也就是说,我们必须先把变量创建出来,后面的代码才能读取或修改它。

1. 定义单个变量

在实际开发中,最常见的做法是在定义变量的同时,直接给它赋一个初始值。

语法:

数据类型 变量名 = 初始值;

说明:

上面这行语法同时完成了两件事:一是创建一个指定类型的变量并为它分配内存空间,二是给这个变量赋予最开始的值。这种在创建变量的同时第一次给它赋值的操作,就叫做 “初始化”。

示例 1:定义并输出变量

#include <iostream>

int main() {
    int age = 20;
    std::cout << age;
    return 0;
}

运行结果如下。

20

分析:

int age = 20; 表示定义了一个名为 age 的整型变量,并将其初始化为 20。紧接着,我们使用专门用来输出内容的 std::cout 把 age 保存的值打印到屏幕上,运行结果就是 20。

2. 一行定义多个同类型变量

如果有多个变量属于同一种数据类型,我们也可以在一行代码中同时定义它们,变量与变量之间用英文逗号(,)隔开。

语法:

数据类型 变量名1 = 初始值1, 变量名2 = 初始值2;

说明:

采用这种写法时,同一行里的所有变量都共用最前面的那一个数据类型。

示例 2:一行定义多个变量

#include <iostream>

int main() {
    int age = 20, score = 95;
    std::cout << age << " " << score;
    return 0;
}

运行结果如下。

20 95

分析:

在这个例子中,我们在同一行定义了 age 和 score 两个整型变量。输出时连续使用了多个 << 按从左到右的顺序依次打印,并在两个变量中间加上了 " ",用来输出一个空格把 20 和 95 隔开,避免两个数字粘在一起变成 2095。

对于这个例子来说,下面 2 种方式是等价的:

// 方式 1
int age = 20, score = 95;

// 方式 2(推荐)
int age = 20;
int score = 95;

在实际开发中,我们更推荐使用方式 2,也就是一行只定义一个变量。等后面代码变复杂以后,每行只写一个变量更容易看清它的类型、名字和初始值。

另外,初学者在一行定义多个变量时,很容易写出 int a, b = 10;,误以为两个变量都成了 10。实际上,这里的 = 10 只会赋给最后一个变量 b,前面的 a 并没有初始化。如果想把两个变量都初始化为 10,必须写成 int a = 10, b = 10; 才行。

3. 先定义,后赋值

创建变量时是不是必须在定义的同时就给出初始值呢?并不是。如果一开始还不知道具体的初始值,比如要等后面计算或用户输入后才能确定,我们可以先定义好变量,等到后面再给它赋值。平时大家也常把这种分步写法称为 “先声明,后赋值”。

示例 3:分步定义与赋值

#include <iostream>

int main() {
    int count;
    count = 10;
    std::cout << count;
    return 0;
}

运行结果如下。

10

分析:

第一行 int count; 先定义了一个整型变量 count,此时还没有给它赋初值。第二行 count = 10; 把整数 10 赋给它,随后再读取输出,结果完全正常。

不过这里有一条重要的语法红线:如果定义变量时没有赋初值,就必须保证在第一次读取它之前已经赋上了确定的值:

// 正确方式
int count = 0;
std::cout << count;

// 错误方式
int count;
std::cout << count;

为什么上面的错误方式不能直接读取呢?因为计算机里的内存空间是反复回收利用的,别的程序用完退还后,里面的旧数据并不会自动清零。如果只写了 int count; 却没有赋初值,这块内存里留下的就是随机的 “垃圾值”。

在 C++ 中,直接读取未初始化的局部变量属于 “未定义行为”,也就是结果不再可控,程序可能会输出一串随机的怪异数字。因此小伙伴们平时写代码时要注意:如果创建变量时暂时不确定具体数值,直接先初始化为 0,写成 int count = 0; 是最稳妥的习惯。

C++ 变量的修改

变量之所以叫 “变量”,就在于它定义好之后,里面的值可以随时修改。在实际开发中,修改变量主要有 2 种常见方式:一种是直接赋一个新值覆盖旧值,另一种是在原值的基础上进行增减。

1. 重新赋值覆盖旧值

当变量已经创建好之后,我们可以随时使用等号(=)把一个新的值交给它,这种操作叫做 “赋值”。

示例 4:覆盖原有的值

#include <iostream>

int main() {
    int age = 20;
    age = 30;
    std::cout << age;
    return 0;
}

运行结果如下。

30

分析:

“咦?age 的值原本不是 20 吗?怎么输出 30 了呢?” 我们可别忘了,age 是一个变量,里面的值是可以改变的。后面的 age = 30; 会直接覆盖原来的初始值 20,最终输出的结果自然就是 30。

这里我们可以顺便区分一下 “初始化” 和 “赋值”。在定义变量的同时第一次给值,比如写成 int age = 20,叫做初始化。等变量创建好之后再去修改它的值,比如写成 age = 30,则叫做赋值。

另外要注意,修改已有变量时直接写 变量名 = 新值; 就可以了。下面这种写法是错误的,因为变量名前面又写了一次 int,编译器会认为你想重复定义同名变量而直接报错:

int age = 20;
int age = 30;    // 重复定义同名变量

2. 在原值基础上更新

除了直接换成一个全新的数字之外,平时写代码时,我们经常需要让变量在 “原来的值” 基础上增加或减少,比如得分加 5 分、库存减 1 件。

示例 5:基于原值增减

#include <iostream>

int main() {
    int score = 60;
    score = score + 5;
    std::cout << score;
    return 0;
}

运行结果如下。

65

分析:

初学的小伙伴第一次看到 score = score + 5; 这句代码,很容易把它当成数学方程来看,心里觉得奇怪:左边的 score 怎么可能等于右边的 score + 5 呢?

其实,在 C++ 中千万不要把等号当成数学等式来理解。程序执行 score = score + 5; 时,会先计算等号右边的 score + 5,再把算出来的结果赋给左边的 score。对于这个例子来说,上面代码等价于下面两步:

int temp = 60 + 5;    // 先算出 65
score = temp;         // 再赋给 score

注意 在 C++ 中,单个等号(=)表示 “把右边的计算结果赋给左边的变量”,方向永远是从右往左,并不是数学里的 “左右相等”。这一点小伙伴们一定要搞清楚。

弄清楚了从右往左赋值的规则后,下面这段代码中,score 的最终值是 70,小伙伴们可以思考一下为什么。

int score = 60;
score = score + 20;
score = score - 10;

上一篇:

下一篇:

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号