何为常量何为变量,从字面上讲就是恒定不变的值和变动的值,实际上呢也差不多这个意思。
我们先来看变量,变量我们主要分为两种 1. 局部变量 2. 全局变量
为了跟好的理解什么是局部变量,什么是全局变量 我们引入两个概念 作用域 和 生命周期。
作用域顾名思义 作用范围 ,生命周期顾名思义存在的时间也就是变量的创建到变量的销毁之间的一个时间段。
我们来看下面的代码:
int main()
{
{
int a = 123;
printf("%d\n", a);
}
int age = 20;
double money = 99.9;
return 0;
}
我们在main函数中的第一个大括号中定义了一个局部变量a,我们打印输出一下
发现没有问题,我们稍稍调整下代码
int main()
{
{
int a = 123;
}
int age = 20;
double money = 99.9;
printf("%d\n", a);
return 0;
}
我们发现在这个局部变量所属的大括号外我们就获取不到这个大括号的值,由此可见,简单来说局部变量的作用域就是它所在的大括号,这个大括号是什么呢?其实就是变量所在的局部范围。
再修改下代码
int main()
{
int a = 123;
{
printf("%d\n", a);
}
int age = 20;
double money = 99.9;
printf("%d\n", a);
return 0;
}
此时我把a这个局部变量提到最外层main函数的大括号里面,我们就发现两处都能使用a,这就是因为虽然a还是局部变量但是现在的作用范围是整个main函数,局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束。其实很好理解,一旦离开作用域它就没用了嘛,既然没用自然就会被销毁,很残酷也很现实。
我们再来看看全局变量,全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。说白了就是整个程序都能用。我们来看下面的代码
int a = 123;
int b;
int main()
{
{
int a = 333;
printf("%d\n", a);
}
int age = 20;
double money = 99.9;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
通过以上代码呢我们就能看到全局变量的几个特性:
1.定义在函数外部,哪哪都能使用。
2.当局部变量和全局变量的名字相同的时候,会优先使用局部变量。但是之所以要有名字无非是为了区分变量嘛,取一样的名字就等着修bug吧,不要自己给自己找不愉快
3.当我们不给全局变量复制时默认为0,这时候就有人要问了局部变量一定要初始化吗?请看:
没错 局部变量是要初始化的。
最后一个问题全局变量的生命周期是什么??一猜就能猜到嘛,既然整个程序都是它的作用域那它肯定和程序共存亡嘛,它的生命周期就是整个程序的生命周期。
变量就聊这么些,我们再看看常量,常量分为以下四种:
1、字面常量 (直接使用的量如:1,2,3)
2、const 修饰的常变量
3、#define 定义的标识符常量
4、枚举常量
我们先来看看const 修饰的常变量 ,这个其实是比较有意思的。
我们尝试修改const修饰的变量a 发现果真不可变,那是不是就说明a是个常量呢?
那我们可以试试看把它当常量用嘛,我们用它来声明数组发现被提示应输入常量,因此我们确定它不是一个常量。所以const 修饰的常变量 只是不能直接被修改本质上还是个变量。
#define 定义的标识符常量,主要看下修改方式,不能修改肯定是不能修改的
枚举常量,所谓枚举就是列举,比如性别:男 女 保密
如上面我们可以用一个枚举类型接收这个值。也可以直接打印出来看看这个值,发现枚举常量的默认是从0开始,依次向下递增1的。当我们试图修改枚举常量的值的时候
显然是会报错的。以上就是简单介绍了常量和变量,还有个小问题,既然const修饰的常变量没有办法直接修改那么是不是有办法简介修改,答案是肯定的,感兴趣的可以自己去了解下