变量的作用域和生命周期
作用域:一般来说,一段程序代码中的变量并不总是有效的/可用的。该变量的可用范围即是该变量的作用域。
变量的作用域是与全局变量/局部变量相联系的。
对于全局变量来说,其作用域包括整个工程。
int a = 4; //定义一个全局变量
int main()
{
printf("/d",a); //a的作用域包括该函数,因此无须声明
return 0;
}
对于局部变量来说,它的作用域一般可以通过{}来判断。
int main()
{
{
int a = 7; //定义一个局部变量a
}
printf("/d",a); //报错,a的作用域仅限于上面的{}内
return 0;
}
另外,关于全局变量:
两个不同的源文件的全局变量一般而言是不可以共通的。
在VC中同一项目下建立两个同样的源文件,一个文件中定义的全局变量在另一个文件中无法使用。
如果想要扩展该全局变量的作用域,需要使用extern关键字。
例如:
在源文件add.c中,我定义了一个变量a = 7。
想要在demo.c中使用它,则
extern int a; //在函数外声明我要使用其它文件的变量
int main()
{
printf("%d",a); //在此我便可以打印a了
return 0;
}
生命周期:指变量从创建到销毁的时间段。
对于局部变量而言,它的生命周期可以通过它的作用域来判定,从作用域开始到作用域结束,这便是它的生命周期。
int main()
{
{
int a = 7; //生命周期开始
printf("/d",a); //生命周期结束
}
return 0;
}
对于全局变量而言,它的生命周期从程序开始运行到程序结束。
常量
常量是程序中不可改变的量。
它分为:
1.字面常量
2.const修饰的常变量
3.#define定义的标识符常量(宏定义)
4.枚举常量
字面常量,是在程序中直接写出来的常量,不能直接调用,目前还不知道有什么用处。
int main()
{
3.14;
6648;
"C";
//上面三个均为字面常量
return 0;
}
const修饰的常变量,是指一个被const函数所修饰而具有了常量属性的变量。
int main()
{
int a = 7;
a = 13; //a为变量,可随意修改值
printf("%d",a); //输出13
const int b = 16; //经过const修饰的b,不能改变其值
printf("%d",b); //输出16
b = 8; //重新赋值会报错。
return 0;
}
尽管被const修饰后的变量拥有了常量属性,但它不能用在一些需要常量的地方,如数组。
#define定义的标识符常量,又称宏定义,是用预处理指令#define定义的常量。
#define NUM 1200 //定义宏NUM=1200,注意末尾无需分号
int main()
{
a = NUM; //在接下来的函数中,NUM指代1200
printf("%d",a); //输出为1200
NUM = 1500; //会报错,NUM为常量
return 0;
}
还需注意的是,一般宏的名字由大写字母组成,此已成程序员规范,但C语言标准中并无硬性的要求。
枚举常量,是用enum定义的一个符号常量集。
enum demo //定义一个符号集demo,内有常量AQ,BQ,CQ
{
AQ, //这些符号的本质是int型数值,AQ=0
BQ,
CQ
}; //注意末尾分号
int main()
{
enum demo a = AQ; //赋值a等于AQ所代表的值,即"0"
printf("%d",a); //输出0
printf("%d",BQ); //输出1
printf("%d",CQ); //输出2
return 0;
}
在枚举常量中,所枚举的字符名称所代表的常量是按照简单的012345方式赋予的,起始值为0,然后依次加一。
可以在初始定义的字符名称中赋值,这相当于改变了起点。
enum C
{
AQ = 8,
BQ, //递增,故BQ = 9
CQ //同理,CQ = 10
};