关键字
- 关键字是C语言提供的,不能自己创建
- 关键字不能做变量名(变量名不能是关键字)
常见关键字
auto break case char const continue default do
double else enum extern float for goto if long
register return short signed sizeof static struct
switch typedef union unsigned void volatile while
auto : 自动的 - 每个
int main()
{
int a =10; //自动创建,自动销毁的 - 自动变量
//auto int a =10; 省略掉了auto
return 0;
}
extern : 用来申明外部符号
register 寄存器关键字
int main()
{
//大量/频繁被使用的数据,想放在寄存器中,提升效率
register int num = 100; //建议num的值存放在寄存器中
return 0;
}
signed : 有符号的
unsigned : 无符号的
static : 静态
union : 联合体(共用体)
void : 空
注意:
define和include不是关键字,是预处理指令
typedef : 类型定义
可以理解为类型重命名
typedef unsigned int u_int;//使用typedef定义u_int变量,实际是unsigned变量
int main()
{
//unsigned int 定义过于冗长,用typedef来定义一个新变量能简化书写
unsigned int num = 100;
//上下两个变量完全一样
u_int num2=100;
return 0;
}
static 静态的
- static修饰局部变量
- static修饰全局变量
- static修饰函数
static修饰局部变量
void test()
{
int a =1;
a++;
printf("%d",a);
}
void test2()
{
static int b =1;
b++;
peintf("%d",b);
}
int main()
{
int i = 0;
while(i<=10)
{
test();
test2();
i++;
}
return 0;
}
Console:
2 2 2 2 2 2 2 2 2 2
2 3 4 5 6 7 8 9 10 11
static 使b变得静止,在程序执行完test2的时候,变量b并没有被销毁,而是保留了下来,以至于每次调用test2的时候,并没有新创建b,用的是原来的那个b,并且一直在++。
由此可见:
static修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型),可以说static修饰的静态变量生命周期=全局变量的生命周期
static修饰全局变量
文件A
//定义一个全局变量
int g_val = 2022;
我在文件A定义的变量,我想在文件B使用,直接使用会报错:未声明的标识符
文件B
int mian()
{
printf("%d\n",g_val);
return 0;
}
Console:
未声明的标识符
我在文件C使用extern声明之后,就可以正常使用文件A定义的变量
int main()
{
//extern声明外部变量
extern int g_val; //extern也可以省略
printf("%d\n",g_val);
return 0;
}
Console:
2022
如果用static来修饰文件A中的全局变量,能不能被新文件调用全局变量?
文件D
//全局变量
static int g_val = 2022;
文件E
extern int g_val;
int main()
{
printf("%d\n",g_val);
return 0;
}
Console:
无法解析的外部符号 g_val
可以看到,在经过static修饰以后,即使用extern来声明变量,还是无法调用原本的g_val
全局变量,在其它源文件内部多可以被使用,是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能被链接到这个静态的全局变量。
从上面的例子能总结出static修饰全局变量的作用:
static修饰全局变量,使得这个全局变量只能在自己所在的源文件(.c)内部使用,其他源文件不能使用。
static修饰函数
和全局变量非常相似,函数在一个文件创建,可以在另一个文件,通过声明,就可以使用
文件A
int Add(int x,int y)
{
return x + y;
}
文件B
//声明函数
extern int Add(int x,int y); //形参可以不用写
int mian()
{
int a =10;
int b= 20;
int sum =Add(a,b);
printf("sum=%d\n",sum);
return 0;
}
Console:
sum=30
若使用static修饰函数之后,则和全局变量出现了一样的结果,同样会报错,只是报错的内容不同
文件C
static int Add(int x,int y)
{
return x + y;
}
文件D
extern int Add();
int mina()
{
int a =10;
int b =20;
int sum =Add(a,b);
printf("sum=%d\n",sum);
return 0;
}
Console:
无法解析的外部符号_Add,函数_mian中引用了该符号
static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其它源文件内部使用
本质上:static是将函数的外部链接属性变成了内部链接属性(和static修饰全局变量一样)