初识C语言关键字

C关键字注意事项

1.只能使用C语言提供的关键字,不能自己创造关键字

2.设置变量名时,不能是关键字

常见关键字

1
auto  break   case  char  const   continue  default  do   double else  enum   extern  float  for   goto  if   int   long  register    return   short  signed sizeof   static struct  switch  typedef union  unsigned   void  volatile  while
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
auto 			自动
break 满足条件时跳出循环
char 字符类型
const 常变量
continue 继续
default 默认
enum 枚举
extern 用来申明外部符号
register 寄存器关键字
signed 有符号的
unsigned 无符号的
sizeof 大小
static 静态修饰
union 联合体(共用体)
void 无 空
while while循环
typedef 类型重命名
define include 都不是关键字,他们是预处理指令

auto

auto 自动 每个局部变动都是auto修饰的

1
2
3
4
5
int main()
{
auto int a = 10;//主动创建-自动销毁 auto可省略
return 0;
}

register

寄存器关键字

作用是可以将大量频繁需要使用的数据放在寄存器中,进而提升效率

1
2
3
4
5
int main()
{
register int num = 100; //建议将num的值存放到寄存器中
return 0;
}

再来介绍一下计算机中关于数据的存储

typedef

定义类型,更准确的说应该是类型重命名

1
2
3
4
5
6
7
typedef unsigned int u_int;
int main()
{
unsigned int num = 100;
u_int num2 = 100; //上下两行意思完全一致
return 0;
}

static

static 修饰局部变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void test()
{
int a = 1;
a++;
printf("%d\n", a);
}

int main()
{
int i = 0;
while(i<10)
{
test();
i++;
}
return 0;
}

这个代码的结果是什么呢

来分析一下

因此结果是2 2 2 2 2 2 2 2 2 2

再看用static修饰的局部变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void test()
{
static int a = 1; //a会被保留,出范围不会被销毁
a++;
printf("%d\n", a);
}

int main()
{
int i = 0;
while(i<10)
{
test();
i++;
}
return 0;
}

结果是2 3 4 5 6 7 8 9 10 11

因此我们可以得知

static 修饰局部变量,会改变该局部变量的生命周期

()

所以,static修饰的局部变量本质上是改变了变量的存储类型,进而改变了局部变量的生命周期

static 修饰全局变量

再新建一个.c文件

之前提到过全局变量在整个工程中都可以被调用,那试一下在别的源文件中进行调用

但是发生了报错,是为什么呢?

因为static修饰的全局变量,使得这个全局变量只能在自己的所在的源文件(.c)内部可以使用,其他源文件不可用

那为什么只有static修饰的变量不能被调用呢?

首先说一下全局变量的属性

全局变量,在其他源文件内部可以被使用,是因为全局变量具有外部链接的属性

但是被static修饰之后,就变成了内部连接的属性,其他源文件就不能连接到这个静态的全局变量了

static修饰函数

static修饰的函数也和全局变量一样

static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用

本质上:static是将函数的外部连接属性变成了内部连接属性,与static修饰的全局变量一样

#define 定义常量和宏

define也是一种预处理指令

define定义符号

1
#define MAX 100

define定义宏

1
2
3
4
5
6
7
#define ADD(x,y) x+y
int main()
{
printf("%d\n", 4*ADD(2,3));

return 0;
}

结果并不是4x5=20,而是11

那是为什么呢?

是因为 define定义的宏是直接进行替换的,因此这个式子不是4*(2+3),而是4*2+3