C语言基础之C语言的常见关键字

C语言中有一些预先定义的字符串,他们本身被赋予了自身的功能。并且我们在定义变量的时候,不能去抢他们的名字来用。他们就是今天的主角:关键字

首先我们简单的和这些关键字见见面(被高亮的关键字是今天要介绍的)

auto break case char const continue default do
double else enum extern float while goto if
static long register return short signed sizeof int
struct switch typedef union unsigned void volatile for

这其中有大家熟知的数据类型:int,char,float,double…

也有控制语句用到的:if,for,do…

还有一些就是今天主要介绍的关键字。

至于还有一些新增的关键字,以上表格未曾提到,大家如果想去了解,可自行查找。

个别术语介绍(可先跳过,后文如若遇到不懂,可回来了解)

自动变量:指的是局部作用域变量,具体来说即是在控制流进入变量作用域时系统自动为其分配存空间, 并在离开作用域时释放空间的一类变量

存储类:是C语言与C++语言的标准中,变量与函数的可访问性(即作用域范围)与生存期

寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

​ 计算机中的数据可以存储到:寄存器,高速缓存器,内存,硬盘,网盘

​ (以上存储从左到右按照,内存越来越大,造假越来越低,传输速度越来越慢排序)

auto

auto:声明自动变量,一般都省略

​ 默认情况下,在代码块内声明的变量都是自动变量,但亦可用自动变量的关键字auto明确标识存储类

代码如下:

int a=0;
//上下两个变量其实相同,只不过上面省略了auto
auto int a=0;
register

register:声明寄存器变量

​ 这个关键字定义变量后,会请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻 址访问,以提高效率。(因为寄存器很小,如果定义了很多register变量,可能会超过CPU的寄存 器个数,超过容量,故变量不是一定会存入寄存器内)

signed和unsigned

signed:有符号的(一般定义常量默认为signed)-------可以存储正数和负数

unsigned:无符号的-----不能存储负数

signed int a=10;	//一般默认为signed,故只要写成:int a=10;
    
unsigned float=-75.3------>错误定义
    
float=-75.3------>正确定义

signed float=-75.3------->正确定义
typedef

typedef:类型重定义-------一般对于太过复杂的数据类型,可以重新定义一个简单的或有辨识度的使用

​ typedef <数据类型> <你取的类型名>

unsigned long int a=10;		//数据类型过于复杂,可以使用typedef重新定义
    
typedef unsigned long int u_l_int;

u_l_int a=10;		        //与unsigned long int a=10等价
extern

extern:用在变量或者函数的声明前,用来说此变量/函数是在别处定义的,要在此处引用

​ 默认情况下全局变量只能在定义它的文件中使用(从定义该全局变量开始到所在文件的文件尾), 但如果在另一个文件中将这个变量声明为外部变量,那么这个变量的作用域将被扩展到另外一个文 件中。

代码如下:

先在源文件中创建项目名为:main.c

#inlcude <stdio.h>
extern int a;
extern int Add(int x,int y);
int main()
{
    
	printf("%d\n",a);
    printf("%d\n",Add(3,2));
}

再在源文件中创建项目名为:test.c-------作为全局变量,函数定义的文件

int a=10;//全局变量
int Add(int x,int y)//
{
	return x+y;//函数定义
}

结果会输出10,5

拓展

  • 变量的声明有两种情况

    ​ 1. 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。

    ​ 2. 另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。

    例如:extern int a 其中变量 a 可以在别的文件中定义的。

    ​ extern int i; //声明,不是定义

    ​ int i; //声明,也是定义

  • 定义分配存储空间,而声明不会

  • 如何区分声明还是变量

  1. extern告诉编译器变量在其他地方定义了
  2. 如果声明有初始化式,就被当作定义,即使前面加了extern
  3. 函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明
  4. 没有extern关键字的都是变量的定义
static

static:声明静态变量

  1. 修饰局部变量 使其生命周期变长(本质上改变了变量的存储类型)
  2. 修饰全局变量 改变了全局变量的作用域,让静态的全局变量只能在自己的源文件内使用

    全局变量在其他源文件内部可以被使用,是因为全局变量具有外部链接属性。但是被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量

  3. 修饰函数 改变了函数的链接属性,将函数的外部链接属性变成了内部链接属性,使得函数只能在自己所在的源文件内部使用

解释1,代码如下:

#include <stdio.h>
void Add(int x)
{
    static int a=2;
    a++;
    printf("%d ",x+a);
}
int main()
{
    int i=0;
    for(i=0;i<3;i++)
    {
        Add(1);
    }
    return 0;
}

结果是4 5 6,大家知道int a=2是一个自动变量,在他作用域结束后,空间就会释放掉,a的值不能保存。

而加上static改变了他的生命周期,使他在整个项目结束前的一直存在,所以a的值会不断迭代

解释2,3,代码如下:(引用extern的内容,大家可以自行对比)

先在源文件中创建项目名为:main.c

##inlcude <stdio.h>
extern int a;
extern int Add(int x,int y);
int main()
{
    
	printf("%d\n",a);
    printf("%d\n",Add(3,2));
}

再在源文件中创建项目名为:test.c-------作为全局变量,函数定义的文件

static int a=10;//全局变量
static int Add(int x,int y)
{
	return x+y;//函数定义
}

产生结果如下:

5F58DBE7-1362-EF3E-B4D5-637311A16796.png

最后注意:#define和#include不是关键字,是预处理指令

以上介绍了一些关键字,但是并没有完全介绍清楚,还有疑问的大家可以自己查询。至于剩下的一些关键字,我将会在以后章节为大家详细介绍。

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据