首页 > 编程笔记

C语言变量定义、声明、初始化和赋值

C语言变量用于存储程序中可以改变的数据。其实变量就像一个存放东西的抽屉,知道了抽屉的名字(变量名),也就能找到抽屉的位置(变量的存储单元)以及抽屉里的东西(变量的值)。当然,抽屉里存放的东西是可以改变的,也就是说,变量的值是可以变化的。

我们可以总结出变量的 4 个基本属性:
程序编译时,会给每个变量分配存储空间和位置,程序读取数据的过程其实就是根据变量名查找内存中相应的存储空间,从其中取值的过程。

实例1:变量的简单输出:
#include<stdio.h>
int main()
{
    int i=10;                         /*定义一个变量i并赋初值*/
    char ppt='a';                     /*定义一个char类型的变量ppt并赋初值*/
    printf("第1次输出 i=%d\n",i);     /*输出变量i的值*/
    i=20;                             /*给变量i赋值*/
    printf("第2次输出 i=%d\n",i);     /*输出变量i的值*/
    printf("第1次输出 ppt=%c\n",ppt); /*输出变量ppt的值*/
    ppt='b';                          /*给变量ppt赋值*/
    printf("第2次输出 ppt=%c\n",ppt); /*输出变量ppt的值*/
    return 0;
}
运行结果:
第1次输出 i=10
第2次输出 i=20
第1次输出 ppt=a
第2次输出 ppt=b

变量在使用前,必须先进行声明或定义,在这个程序中,变量 i 和 ppt 就是先进行定义的。而且变量 i 和 ppt 都进行了两次赋值,可见,变量在程序运行中值是可以改变的。第 04 行和第 05 行是给变量赋初值的一种方式,变量的初始化也可以先声明类型再赋初值。

C语言变量声明

在大多数程序设计语言中,使用一个变量之前,都要对这个变量进行声明,C语言同样如此。那么,什么是变量的声明呢?有什么作用呢?

变量的声明其实就是在程序运行前,告诉编译器程序使用的变量以及与这些变量相关的属性,包括变量的名称、类型和长度等。这样,在程序运行前,编译器就可以知道怎样给变量分配内存空间,可以优化程序。

C语言变量的声明语句的形式如下:

数据类型  变量名;

变量的声明包括变量的数据类型名和变量名两个部分,变量的声明必须在变量使用之前。

来看下面的例子:

int num;
double area;
char ppt;

其中,int、double 和 char 是数据类型名,num、area 和 ppt 是变量名,即变量 num 是 int 类型(整型),area 是 double 类型(双精度实型),ppt 是 char 类型(字符型)。

数据类型包括C语言已定义的数据类型和用户自定义的数据类型。C语言常用的已定义的数据类型包括整型、字符型、实型、枚举型和指针类型等。

变量名其实就是一个标识符,要符合标识符的命名规则,详见:C语言变量名的命名规则

注意事项

如果变量没有经过声明而直接使用,则会出现编译器报错的现象。下面用一个例子来验证声明必须在变量使用的前面。

实例2:验证未声明的标识符不可用。:
#include<stdio.h>
int main(void)
{
    printf("www.weixueyuan.net is %d years old.\n", age);
    return 0;
}
编译后显示出错,信息如下:

error:'age' undeclared(first use in this function)

在此例子中,没有对标识符 age 进行声明就直接引用,编译器不知道 age 是什么,所以调试时编译器就会报错。

在第 4 行前插入如下语句。

int num=10;

或者:

int num;
num=8;

程序就不会报错了,就能正常运行了。

C语言变量的定义

上面已经详细讲解了C语言变量的声明,那么变量的声明与变量的定义有什么区别呢?声明一个变量意味着向编译器描述变量的类型,但并不一定为变量分配存储空间。

从广义的角度来讲声明中包含着定义,但是并非所有的声明都是定义。一般情况下我们常常这样叙述,把建立空间的声明称为“定义”,而把不建立存储空间的称为“声明”。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同时还可以对变量进行初始化。

来看下面的例子:
void main()
{
    int a;
    int b=1;
    extern int c;
}
对于第 03 行、第 04 行代码,它既是声明,又是定义,即“定义性声明”,编译器会为变量 a、b 分配存储空间;到第 05 行,其中变量 c 是在别的文件中定义的,是“引用性声明”,编译器不会给变量 c 分配内存空间。extern 只作声明,不作定义。

C语言变量的初始化和赋值

既然变量的值可以在程序中改变,那么,变量必然可以多次赋值。我们把第1次的赋值称为变量的初始化。

下面来看一个赋值的例子。
int i;
double f;
char a;
i=10;
f=3.4;
a='b';
在这组语句中,第 01~03 行是变量的定义,第 04~06 行是对变量赋值。将 10 赋给了 int 类型的变量 i,3.4 赋给了 double 类型的变量 f,字符 b 赋给了 char 类型的变量 a。第 04~06 行使用的都是赋值表达式。

对变量赋值的主要方式是使用赋值表达式,其形式如下。

变量名=值;

那么,变量的初始化语句的形式为:

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

例如:
int i=10;
int j=i;
double f=3.4+4.3;
char a='b';
其中,我们对变量类型名和变量名已经比较了解,现在就来看一下=和初始值。

=为赋值运算符,其作用是将赋值运算符右边的值赋给运算符左边的变量。赋值运算符左边是变量,右边是初始值。其中,初始值:
那么,变量 i 的值是 10,变量 j 的值也是 10,变量 f 的值是 7.7,变量 a 的值是字符 b。

变量声明时不仅可以给一个变量赋值,也可以给多个变量赋值,形式如下。

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

例如:

int i=10,j=20,k=30;

上面的代码分别为变量 i 赋值 10,为变量 j 赋值 20,为变量 k 赋值 30,相当于语句:
int i,j,k;
i=10;
j=20;
k=30;
下面的语句相同吗?
int i=10,j=10,k=10;
int i,j,k; i=j=k=10;
int i,j,k=10;
这几条语句看上去类似,但是却不同。第 01 行的作用和第 02 行相同,都是定义 i、j、k 这 3 个变量,并对它们初始化。但是第 03 行的功能则不同,它同样定义了 i、j、k 这 3 个变量,但只给 k 赋了初值 10。

优秀文章