很多初学者会感受到对于const,static两个关键字用法有很多相似之处,并纠结于两者如何使用。本文将通过具体实例辨析两者用法。
一、const
C语言存在变量与常量两个概念。用通俗的话来讲,在我们写代码时,常量的值是固定的而变量的值可以随操作者的需求随时改变,例如:
int a = 1;
printf("%d\n", a);
a = 2;
printf("%d\n", a);
数字 1,2是常量。而a是变量,当我们在第一行代码中定义了整型变量a的值为1后,我们可以修改a的值变为2。
此时,const关键字用来将变量修饰为常变量,通常放在变量定义类型的前面:
const int a = 1;
a = 2;
我们就定义了一个常变量a。将a定义为常变量后如果我们接下来将2赋值给a时,编译器将会报错:“左值定义常变量”。也就是说当变量a被const修饰后a便无法被操作者修改,有了常量的属性。
二、static
static关键字与const关键字有异曲同工之处,static关键字不仅能用来修饰局部变量,修饰全局变量,称为静态全局变量,还可以用来修饰函数。
static修饰后的变量是“静态”的,静态变量和常变量不同,静态变量的意义是延长了变量的生命周期。通常如果我们定义一个函数,函数内存有变量a,那么当函数调用完后销毁时,变量a也随之销毁,计算机将变量a所占的空间返还给系统。而当变量a被static修饰变为静态变量后,a在函数销毁后不会被销毁,静态变量的值是可以被改变的
对于static及静态变量的理解,我们可以先来看下面一个例子:
void test()
{
int a = 5;
a++;
printf("%d\n", a);
}
int main()
{
for(i = 0; i <10; i++)
{
test;
}
return 0;
}
当我们观察这段代码时,我们会发现,在卖弄函数里用了一个for循环,循环调用test函数,调用十次,每次调用test()函数时,都会将数字五赋给,随后变量a加一,输出a的值。因此最终输出的结果很容易得到是6、6、6、6、6、6、6、6、6、6十个六;当我们在 “int a = 5;” 这个语句前面用static修饰时:
void test()
{
static int a = 5;
a++;
printf("%d\n", a);
}
int main()
{
for(i = 0; i <10; i++)
{
test;
}
return 0;
}
我们发现输出结果变成了6、7、8、9、10、11、12、13、14、15这十个截然不同的数字。这是为什么呢? 我们通过static关键字的定义可以得知,static修饰的变量a在包含它的函数销毁后,a并不会销毁。因此在这个程序中第一次调用函数test()时,a的值变为6。在函数销毁后准备第二次调用时,a依然存在,并且保持原来的值不变仍为6,第二次调用时a++,a的值变为7,依此类推。