Skip to content

L1-03 变量

在程序运行期间其值可以改变的量称为变量。变量是代码中最重要的元素。

一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念。

几乎所有程序都离不开变量。做饭之前要准备食材,写字画画之前要准备笔墨,刺绣之前要准备针线,我们写程序之前当然也要准备好相应的“素材”,这就是变量。

使用变量

在 C++ 语言中,要求对所有用到的变量作强制定义,也就是必须“先声明,后使用”。定义变量的一般形式是:变量类型 变量名表列。变量名表列指的是一个或多个变量名的序列。

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n; //声明一个变量,名字叫做n,n是一个整型变量
}

数据类型

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。

您可能需要存储各种数据类型(比如字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。

在上面的例子中,我们声明了一个整型变量 n

变量声明

变量一经声明就不能改变了。下面这段程序,编译就会报错。

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n; //声明一个变量,名字叫做n,n是一个整型变量
    long long n; //再次声明
}

哪怕再次声明相同类型的变量,如下所示程序,也会报错。

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n; //声明一个变量,名字叫做n,n是一个整型变量
    int n; //再次声明
}

可以连续声明多个变量。

c++
int main()
{
    int n; //声明一个变量,名字叫做n,n是一个整型变量
    int m; //声明一个变量,名字叫做m,m是一个整型变量
}

相同数据类型的变量,可以一起声明,中间用逗号隔开。

c++
int main()
{
    int m, n; //声明2个整型变量,名字分别叫做m,n
}

变量名可以是单词

变量的名字可以不仅仅是一个字符,可以是单词、拼音,这样可以提高代码的可读性。

c++
int main()
{
    int max, min; //声明2个整型变量,名字分别叫做max,min,用来保存最大值和最小值

变量赋值

直接赋值

赋值需要先声明变量,再将值赋给变量。

c++
int a, b;
a = 3;
b = 4;

不声明则无法通过编译。

c++
a = 3;
b = 4;
int a, b;

可以在声明的同时赋值。

c++
int a = 3, b = 4;

从其他变量赋值

故名思意,就是将其他变量的值付给当前变量。

c++
int a, b = 4;
a = b;

赋值还可以这样:

c++
int a, b = 4;
a = b + 3; //a = 7

还可以这样:

c++
int b = 4, a = -b; //a = -4

但是这样会编译错误,因为在对 a 赋值前,b 没有声明。

c++
int a = -b, b = 4; //这样会错

从自己赋值

变量还可以通过自己以前的值,来进行赋值。

c++
int a = 4;
a = a + 1; //a = 5
a = a * 2; //a 从5变为10

上面的程序还可以这样写。

c++
int a = 4;
a += 1; //a = 5
a *= 2; //a 从5变为10

变量还可以通过 ++ 和 −− 进行赋值,其作用等同于 +=1 以及 −=1 。

c++
int a = 4;
a++; //a = 5
a--; //a = 4
++a; //a = 5
--a; //a = 4

单选题

可否使用一个常量对变量赋值?

A. 正确

B. 错误

  • 答案

    正确,可以使用一个常量对变量赋值;例如:a=10;

常见问题

变量名的拼写

凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在声明部分写了

c++
int student;

而在执行语句中错写成 statent 。如

c++
statent=30;

在编译时检查出 statent 未经定义,作为错误处理。输出“变量 statent 未经声明”的信息,便于用户发现错误,避免变量名使用时出错。

变量名与标识符

单选题

在 C++ 中下面哪个不是合法的变量名( D )。

A. sum

B. Student_name

C. BASIC

D. M.D.Joh

  • 题解

    变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。 1.只能由字母( A-Z , a-z ) 、数字(0-9)和下划线(\ _)组成。 2.不能数字开头。 3.不能用C++关键字来命名变量,以免冲突。 因此选D

用来标识变量、符号常量、函数、数组和类型等实体名字的有效字符序列称为**标识符 (identifier) **。简单地说,标识符就是一个名字。变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。

标识符只能由字母( A−Z, a−z )、数字( 0−9 )和下划线( _)组成,第一个字符必须为字母或者下划线开头,不能用 C++ 关键字来命名变量,以免冲突。

下面是不合法的标识符和变量名:

M.D.John1233G64Ling liC++Zhang−lingU.S.A.

单选题

下面哪个是合法的变量名( C )。

A. $123

B. #3345

C. li_ling

D. Zhang-ming

  • 题解

    变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。 1.只能由字母( A-Z , a-z ) 、数字(0-9)和下划线(\ _)组成。 2.不能数字开头。 3.不能用C++关键字来命名变量,以免冲突。 因此选C

关键字

除了标识符的限制,变量名还不可以是 C++ 的关键字。例如:定义一个名为 int 的整型变量,就会出现编译错误。

c++
int int;

单选题

下面不是 C++ 关键字的是( C )。

A. int

B. for

C. child

D. public

题解

C++ 关键字常见关键字: char、double、else、float、if、int、long、namespace、new、public、return、switch、using、void、while

C++的关键字
asmelsenewthis
autoenumoperatorthrow
boolexplicitprivatetrue
breakexportprotectedtry
caseexternpublictypedef
catchfalseregistertypeid
charfloatreinterpret_casttypename
classforreturnunion
constfriendshortunsigned
const_castgotosignedusing
continueifsizeofvirtual
defaultinlinestaticvoid
deleteintstatic_castvolatile
dolongstructwchar_t
doublemutableswitchwhile
dynamic_castnamespacetemplate

注意大小写

在 C++ 中,大写字母和小写字母被认为是两个不同的字符。因此, sumSUM 是两个不同的变量名。因此, sumSUM 是两个不同的变量名。一般地,变量名用小写字母表示,与人们日常习惯一致,以增加可读性。

以下程序会出现编译错误。

c++
int sum;
SUM = 30;

头脑风暴

倒水问题

桌面上有 N 个杯子,第一个杯子装了 1 毫升水,第二个杯子装了 2 毫升水,第三个杯子装了 3 毫升水…第 N 个杯子装了 N 毫升水。每次你可以从中挑选一个或几个你喜欢的杯子,倒掉“相同毫升的水”,当然,这几个杯子里要都有足够的水可倒,比如说一个装有 2 毫升水的杯子,可不能被倒掉 3 毫升水。聪明的你有没有什么好的策略,用最少的次数把所有杯子里的水倒没呢?

举个例子来看,比如 N=3 ,三个杯子里水量分别是 [1,2,3] ,第一次我会把第二杯和第三杯水分别倒掉 2 毫升,这样三个杯子水量分别变成了 [1,0,1] ,第二次操作我会把第一杯和第三杯水分别倒掉 1 毫升,这样三个杯子的水量分别变成了 [0,0,0] ,至此三个杯子全空了,达到目标,我只进行了两步操作!

那么当 N=10,100,1000 的时候,你最少能多少次操作达到目标呢?

我们将所有水量大于等于 n2 的统一倒掉 n2 ,这样所有杯子的水量都小于等于 n2 。我们通过一次操作,就可以让水量最大的杯子中的水量减半。如此只需要 log(n) 次,就可以将所有杯子清空。

代码练习

课堂练习:启蒙练习-乘法

输入一个数n,请你输出 n 乘以 3 的值。

输入格式

输入一个数n

输出格式

输出一个数,表示3n的值。

输入样例

34

输出样例

102

数据范围

对于100%的数据,1<n≤2000。

样例解释

c++
#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  cin >> n;
  cout << n * 3 << endl;
  return 0;
}

看看这段代码有什么错误?

c++
#include<bits/stdc++.h>
using namespace std;

int main(){
    cin >> n;
    cout << 3 * n;
    return 0;
}

给出的代码,其中变量 n 没有定义就使用了。因此在使用变量 n 之前,增加变量定义 int n; 即可。

课堂练习:启蒙练习-混合运算1

已完成

输入一个数n,请你输出 n 乘以 3 加 7 的值。

输入格式

输入一个数n。

输出格式

输出一个数,表示n*3+7的值。

输入样例

6

输出样例

25

数据范围

对于100%的数据,0<n≤50000。

样例解释

c++
#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  cin >> n;
  cout << n * 3 + 7 << endl;
  return 0;
}