C 变量是什么?
先问小伙伴们一个问题:学习一门语言,最先要了解的是什么呢?当然是词汇啊!就像学英语一样,再简单的一句话,我们也得先弄清楚每一个单词是什么意思,然后才知道一句话说的是什么,对吧?
同样的,学习 C 语言也是如此。先来看一句代码。
int year = 2030;英语都是一句话一句话地表述的,上面这行代码就相当于 C 语言中的 “一句话”,我们称之为 “语句”。在 C 语言中,每一条语句都是以英文分号(;)作为结束符。每一条语句都有它特定的功能,这个跟英语一样,每一句话都有它表达的意思。
在 C 语言中,变量与常量就像是英语中的词汇,比如上面代码中的 year 就是 C 语言中的变量。变量指的是一个值可以改变的量。也就是说,变量的值在程序运行过程中是可以改变的。
提示: 从计算机内存的角度来看,变量是内存中一块具有特定名称的存储空间,用于存储数据。
C 变量的命名
想要使用变量,我们就肯定得先给它起一个名字(命名),就像每个人都有自己名字一样。当别人喊你的名字时,你就知道别人喊的是你,而不是路人甲。
当 C 程序需要使用一个变量时,我们只需要使用这个变量的名字就行了,总不能叫:“喂,我要用这个变量”,对吧?每个程序里面的变量那么多,鬼才知道你要用哪个变量呢。
变量的名字一般是不会变的,但它的值却可以变。这就像人一样,名字一般都是固定下来,但是每个人都会改变,都会从少年成长为中年,然后从中年慢慢变成老人。

在 C 语言中,给一个变量命名,我们需要遵循以下2个方面的原则。
- 变量名由字母、数字或下划线组成,并且第一个字符必须是字母或下划线。
- 变量名不能是 C 语言关键字。
上面两句话很简单,但却非常重要,一定要字斟句酌地理解。从第 1 点可以知道,变量只可以包含字母(大写小写都行)、数字、下划线(_),不能包含除了这 3 种之外的其他字符(如 %、-、*、/、$ 等)。这是因为其他很多字符,C 语言都给它们分配了特定的功能,比如 “-” 就是减号,“/” 就是除号,“*” 就是乘号等。
对于第 2 点,关键字指的是 C 语言本身 “已经在使用” 的名字。因此我们在给变量命名的时候,是不能使用这些名字的(因为 C 语言要用)。想要知道 C 语言关键字都有哪些,另请参阅:C 关键字。
示例 1:正确的 C 变量名
n
lvye_net
_site
a123示例 2:错误的 C 变量名
123a // 不能以数字开头
-abc // 不能以中划线开头
my-name // 不能包含中划线
break // 不能和 C 关键字相同此外,变量的命名一定要严格区分大小写,例如 name 与 Name 在 C 语言中就是两个不同的变量。
C 变量的使用
在 C 语言中,如果想要使用一个变量,我们一般需要进行 2 步:① 变量的声明;② 变量的赋值。其中 “变量的赋值” 又叫做 “变量的初始化”,这两种叫法是一样的,大家也要熟悉一下。
实际上,变量的声明是告诉计算机这是一个什么类型的变量,并为其分配相应的内存空间。变量的赋值,则是将具体的值存储到这块内存空间中。
语法:
类型名 变量名 = 值;说明:
变量的声明,我们可以使用 int、float、char 等来声明,所谓的 “声明” 指的是定义变量的数据类型,比如 int a; 就表示定义了一个整数类型的变量,而 float a; 就表示定义了一个浮点数类型的变量。对于 C 数据类型,我们在下一节再详细介绍。
一般来说,变量的声明和变量的赋值(初始化),可以分开来实现,也可以合并来实现。下面 2 种方式是等价的。
// 方式 1:分开
int year; // 变量的声明
year = 2030; // 变量的赋值(初始化)
// 方式 2:合并
int year = 2030;
在 C 语言中,如果写 int year;,然后直接打印 year(不赋值),那么它的值是一个 “垃圾值(随机数)”,而不是 0。因此,如果只声明了变量但没有给它赋值,千万不要直接使用或打印它。
示例 3:打印一个变量
#include <stdio.h>
int main(void)
{
int a = 10;
printf("%d", a);
return 0;
}运行结果如下。
10分析:
在这个例子中,我们使用 int 来定义一个整数变量,该变量的名字为 a,变量的值为 10。然后使用 printf() 函数输出这个变量的值。对于变量的命名,我们尽量取一些有意义的英文名或英文缩写。当然,为了讲解方便,本教程有些变量的命名可能比较简单。在实际开发中,我们尽量不要太随便。
此外,我们也可以同时声明多个变量名,其中变量之间必须用 “英文逗号(,)” 隔开,下面 3 种方式是等价的。
// 方式 1
int a = 10;
int b = 20;
int c = 30;
// 方式 2
int a = 10, b = 20, c = 10;
// 方式 3
int a, b, c;
a = 10;
b = 20;
c = 30;示例 4:修改变量的值
#include <stdio.h>
int main(void)
{
int a = 10;
a = 15;
printf("%d", a);
return 0;
}运行结果如下。
15分析:
咦?a 的值不是 10 吗?怎么输出 15 呢?大家别忘了,a 是一个变量。变量,简单来说就是一个值会变的量。因此 a = 15 会覆盖 a = 10。我们再来看一个例子就会有更深的理解了。
示例 5:变量值的改变
#include <stdio.h>
int main(void)
{
int a = 10;
a = a + 1;
printf("%d", a);
return 0;
}运行结果如下。
11分析:
a = a + 1; 表示 a 的最终值是在原来 a 的基础上加 1,因此 a 最终值为 11(10 + 1)。下面代码中,a 的最终值是 6,小伙伴们可以思考一下为什么。
int a = 10;
a = a + 1;
a = a - 5;示例 6:变量先声明后赋值
#include <stdio.h>
int main(void)
{
a = 10;
printf("%d", a);
return 0;
}编译时会报错,如下所示。
(报错)each undeclared identifier is reported only once for each function it appears in分析:
对于变量来说,我们最后还需要注意一点:变量必须先声明,然后再能对它赋值。如果一个变量没有声明就对它赋值,程序就会报错。
原因很简单,变量声明其实就是告诉计算机这是一个什么类型的变量,然后才能给这个变量分配对应大小的存储空间。如果没有变量声明,计算机就不知道这个变量的类型,接下来就不知道怎么面对这个突然闯进来的 “外来生物”了。
C 变量的常见问题
1. 在 C 语言中,变量声明和变量赋值这 2 步,有必要分开来写吗?
实际上很多 C 语言教材,都是把变量声明和变量赋值分开来写。一般都是先把整个程序需要用到的变量放在开始处统一声明,然后在后面再一个个进行赋值,比如下面的方式 1。
其实方式 1 是比较麻烦的,在绝大多数编程语言中,我们更多的是把变量声明和变量初始化合并在一起,也就是方式 2。在后面的学习中,我们也更推荐使用方式 2,主要是因为它更加直观简单,随想随用。
// 方式 1(不推荐)
#include <stdio.h>
int main(void)
{
int a, b, result; // 统一进行变量声明
a = 10;
b = 5;
result = a + b;
printf("%d", result);
return 0;
}
// 方式 2(推荐)
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 5;
int result = a + b;
printf("%d", result);
return 0;
}2. 变量的作用域是什么?
变量的作用域指的是变量在程序中有效的范围。在 C 语言中,变量主要有两种作用域:
- 局部变量:在函数内部声明的变量,只在该函数内部有效。当函数执行结束后,局部变量所占用的内存空间会被释放。
- 全局变量:在函数外部声明的变量,从声明的位置开始到整个程序结束都有效。
想要真正了解变量的作用域,需要等学完了 “C 函数” 这一章才行。
