目录
1.变量
变量分为全局变量和局部变量,但是写代码的时候尽量使用局部变量。
1)全局变量与局部变量生命周期上的差别
全局变量的生命周期是整个程序的生命周期,而局部变量的生命周期则是进入作用域,生命周期开始,出了作用域,生命周期结束。
2)通过关键字static修饰,来改变局部变量的生命周期
因为局部变量的生命周期极其有限,我们可以通过关键字static来改变局部变量的生命周期,让局部变量不会因为出了作用域,该局部变量的生命周期就结束,而是到程序结束以后,该局部变量的生命周期才会结束。
例:
#include <stdio.h>
void fun() {
int i = 0;
i++;
printf("i = %d\n", i);
}
void main()
{
for (int i = 0; i < 10; i++) {
fun();
}
}
而这个执行结果为
而通过static修饰i以后
#include <stdio.h>
void fun() {
static int i = 0;//具有记忆性
i++;
printf("i = %d\n", i);
}
void main()
{
for (int i = 0; i < 10; i++) {
fun();
}
}
修饰后结果为
上述情况是因为,在局部变量i没有被static修饰的时候,每一次循环都是在重新申请一个空间,将这个空间命名为i,然后在函数fun结束以后,此时所定义的空间将被释放,当遇到下一循环的时候,则重复上面的动作。
而,通过static定义后的局部变量,他在第一次循环,执行函数fun的时候,申请的一个空间i,该空间的生命周期遭到改变,使他不会因为fun函数结束后,空间被释放掉,当下一次循环执行fun函数的时候,也是对原本的空间的值进行改变。也就是,申请一个空间i这个动作在此时,只是执行了一次。
3)static修饰全局变量
当任务出现多个文件的时候
例:
一个源文件里有全局变量a
int a = 100;
另一个源文件想要引用a的话,要在该文件内对该全局变量进行申明
extern int a;//对别的文件中的全局变量进行申明
void main()
{
printf("a = %d",a);
}
如果在全局变量a所在的源文件中,用static进行修饰,则即使另一个源文件通过申明,也无法使用a。
static int a = 100;
如图
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用, 不能在其他源文件内使用。
4)全局变量和局部变量同名时的优先级
如果全局变量,与局部变量同名的时候,则会就近,局部变量的优先级是高于全局变量的。
例:
在这串代码中,其中,a则为全局变量,b则为在主函数中有效的局部变量。当在代码中重新定义一个与a同名的局部变量的时候,则此局部变量的优先级是高于全局变量的。
#include <stdio.h>
int a = 20;
void main()
{
int a = 10;
int b = 30;
printf("%d", a);
}
而这个的执行结果为
2.常量
1)通过const对变量进行修饰,让其变成常量
例:
#include <stdio.h>
void main()
{
int a = 10;
const int b = 30;//const将变量修饰为常量
a = 20;
b = 30;
printf("%d", a);
}
当我们用const将b修饰为一个常量的时候,我们再通过b = 30语句则无法修改b的值,而编译软件对于此也会出现报错。
这个时候,b则变为一个不可被修改的常量。
2)字面常量
例:
#include <stdio.h>
void main()
{
int a = 10;
const int b = 30;
10;//字面常量
}
在这段代码中,10就是作为一个字面常量出现的。
3)#define定义的标识符常量
例:
#define MAX 100//define定义的标识符常量
4)枚举常量
例:
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量