设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间07 现在时间07 缓存数据 给自己一个目标,给自己一个希望,给自己一份爱、一份温暖,只为今天快乐,不为昨天烦恼,自己照顾好自己,我的朋友。

给自己一个目标,给自己一个希望,给自己一份爱、一份温暖,只为今天快乐,不为昨天烦恼,自己照顾好自己,我的朋友。

查看: 926|回复: 1

C语言学习之关键字的示例详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:230
  • 打卡月天数:1
  • 打卡总奖励:3531
  • 最近打卡:2025-07-02 11:35:37
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
435
主题
398
精华
0
金钱
4822
积分
896
注册时间
2023-1-8
最后登录
2025-7-2

发表于 2023-2-13 09:30:43 | 显示全部楼层 |阅读模式
1. 前言

大家好,我是努力学习游泳的鱼。关键字,这名字一听,就很关键。而有些关键字,你可能不是很了解,更别谈使用。所以,这篇文章将带你见识常见的关键字,一起领略它们的风采吧。

2. 什么是关键字

C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,
用户自己是不能创造关键字的。
大部分关键字会在其他章节介绍,这里仅介绍一些稍微有点难度的关键字。

3. extern-声明外部符号

extern可以用来声明外部符号,如外部的全局变量和函数。
如我们在test1.c里定义了全局变量aint a = 2022;
我们想在test2.c里使用,就得先用extern声明一下extern int a;
注意:一般extern是用来声明外部的全局变量的。因为如果直接写int a;就不是声明了,而是定义,会直接创建一个变量a。只有写extern int a;才是声明变量a。如果是声明外部的函数,可以省略掉extern。如直接写int Add(int, int);和写extern int Add(int, int);效果是相同的。

4. auto-自动

C语言里的局部变量,进入局部范围时自动创建,出局部范围时自动销毁。这种自动创建,自动销毁的特性,其实是由于前面省略了关键字auto。比如,int a = 0;其实编译器会处理为auto int a = 0;一般来说,auto会被省略掉。

5. typedef-类型重定义(类型重命名)

typedef关键字用于给类型起别名,相当于起了个外号。
比如unsigned int num = 10;如果我们嫌unsigned int这个类型写起来太麻烦了,可以给它起个别名叫做uint:typedef unsigned int uint;这样上面的代码就等价于uint num = 10;

6. register-寄存器


6.1 存储器

数据的存储,需要存储器。常见的存储器有:
网盘,硬盘,内存,高级缓存,寄存器。
从左到右,速度越快,从而造价越高,从而空间越小。
早期,CPU处理的数据都来自内存。当时,CPU的处理速度和内存的读写速度是差不多的。随着技术的迭代,内存的读写速度逐渐跟不上CPU的处理速度,CPU在很大程度上被闲置了。
于是就有了这么一层设计。在内存之上设置读写速度更快的高级缓存和寄存器。CPU从寄存器中拿数据,与此同时,寄存器从高级缓存中拿数据,高级缓存从内存中拿数据。如果CPU想要的数据在寄存器中没有,那就直接从高级缓存中拿数据,如果还没有再从内存中拿。由于大部分数据都能在寄存器中命中,整体上,处理数据的速度就提升了。
以上,我们能明白一点:
寄存器的读写速度是非常快的!

6.2 register关键字的作用

如果我们写int num = 10;num是放在内存中的。如果我们加了个registerregister int num = 10;此时register的作用是建议把num放在寄存器中。注意只是建议,实际是否放在寄存器中取决于编译器的处理。

7. static-静态

在C语言中,static有3种用法,分别修饰局部变量,全局变量和函数。
1.修饰局部变量-称为静态局部变量
2.修饰全局变量-称为静态全局变量
3.修饰函数-称为静态函数

7.1 static修饰局部变量

7.1.1 代码对比
下面代码的输出结果是多少呢?
  1. #include <stdio.h>

  2. void test()
  3. {
  4.         int a = 5;
  5.         a++;
  6.         printf("%d ", a);
  7. }

  8. int main()
  9. {
  10.         int i = 0;
  11.         while (i < 10)
  12.         {
  13.                 test();
  14.                 i++;
  15.         }

  16.         return 0;
  17. }
复制代码
输出结果:
  1. 10个6
复制代码
为什么呢?test函数被调用了10次,每次都做了同样一件事,创建a并初始化为5,a自增变成6,打印a(即6)。本质上,每次进入test函数都会创建a,出test函数时都会销毁a。这是由于局部变量的特性:进入局部范围创建,出局部范围销毁。那么,每次进入test函数创建的都是一个新的a,和之前创建的a没有任何关系。
明白这点后,再看下面这段代码,输出的结果又是多少?
  1. #include <stdio.h>

  2. void test()
  3. {
  4.         static int a = 5;
  5.         a++;
  6.         printf("%d ", a);
  7. }

  8. int main()
  9. {
  10.         int i = 0;
  11.         while (i < 10)
  12.         {
  13.                 test();
  14.                 i++;
  15.         }

  16.         return 0;
  17. }
复制代码
答案:
  1. 输出6~15。
复制代码
分析一下:第一次调用test函数时和没有static相同,创建a并初始化,自增,打印(此时a是6),但第二次调用怎么就打印7了呢?这说明,第二次调用时,a还是上次调用留下来的6,才会自增变成7!也就是说,第一次调用结束后,a并没有销毁,第二次调用时依然存在。同理,第二次调用后a也没有销毁,第三次调用时a仍是第二次调用留下来的7,然后自增变成8后打印,以此类推。
static修饰局部变量的时候,局部变量就变成了静态的局部变量,出了局部的范围,不会销毁,下一次进入函数依然存在。
7.1.2 原理分析
内存可以分为:栈区,堆区,静态区,等等。
栈区存储的是局部变量,函数参数,等等。
堆区是用来动态内存开辟的,与之相关的函数有malloc,realloc,calloc和free等等。
静态区存储的是静态变量和全局变量。
静态的局部变量出了作用域依然存在,是因为它是存储在静态区的。
同样存储在静态区的全局变量,生命周期也很长。
static修饰局部变量时,实际改变的是变量的存储位置,本来一个局部变量是放在栈区的,被static修饰后放在了静态区,从而导致,出了作用域依然存在,生命周期并没有结束。
注意:放在静态区的变量出了作用域不销毁,相当于生命周期变长了,但是作用域并没有发生变化,也就是说,静态的局部变量仍然只能在它的局部范围内使用!
静态区中的数据的生命周期和程序的生命周期是一致的。程序结束,静态数据的生命周期也就到了。

7.2 static修饰全局变量

7.2.1 代码对比
我们创建两个源文件,test1.c和test2.c
在test1.c里定义一个全局变量g_val
  1. // test1.c
  2. int g_val = 2022; // 全局变量,定义在test1.c中
复制代码
在test2.c内部使用这个全局变量,由于全局变量的作用域是整个工程,所以可以跨源文件使用。但是在使用前需要使用extern声明,否则会报编译错误。
  1. // test2.c
  2. extern int g_val;

  3. int main()
  4. {
  5.         g_val = 2023;
  6.        
  7.         return 0;
  8. }
复制代码
如果我们在g_val的定义前面加上static会发生什么呢?
  1. // test1.cstatic int g_val = 2022; // 全局变量,定义在test1.c中// test2.c
  2. extern int g_val;

  3. int main()
  4. {
  5.         g_val = 2023;
  6.        
  7.         return 0;
  8. }
复制代码
此时会报链接错误,因为g_val是定义在test1.c里的静态全局变量,不能在test2.c内部使用。看来静态的全局变量不能跨文件使用了。
7.2.2 原理分析
一个全局变量本来是具有外部链接属性的,既能在自己所在的源文件内部使用,也能在其他文件内部使用。
但是被static修饰之后外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用了。
使用上感觉作用域变小了。

7.3 static修饰函数

7.3.1 代码对比
我们在test1.c里定义一个函数
  1. // test1.c
  2. int Add(int x, int y)
  3. {
  4.     return x + y;
  5. }
复制代码
在test2.c内部使用,同理要先声明(此时可以省略extern),否则会报一个警告。
  1. // test2.c
  2. #include <stdio.h>

  3. extern int Add(int, int); // extern可以省略

  4. int main()
  5. {
  6.         int sum = Add(10, 20);
  7.         printf("sum = %d\n", sum);
  8.        
  9.         return 0;
  10. }
复制代码
如果在函数定义前加上static会发生什么呢?
  1. // test1.cstatic int Add(int x, int y){        return x + y;}// test2.c
  2. #include <stdio.h>

  3. extern int Add(int, int); // extern可以省略

  4. int main()
  5. {
  6.         int sum = Add(10, 20);
  7.         printf("sum = %d\n", sum);
  8.        
  9.         return 0;
  10. }
复制代码
此时会报链接错误,因为Add函数是定义在test1.c内部的静态函数,不能在test2.c内部使用。看来static修饰函数和修饰全局变量类似,静态的函数也不能跨文件调用。
7.3.2 原理分析
static修饰函数的作用:一个函数本来是具有外部链接属性的,但是被static修饰之后,外部链接属性就变成了内部链接属性,这时这个函数只能在自己所在的源文件内部使用,其他文件是无法使用的。
使用上的感觉好像是作用域变小了。
到此这篇关于C语言学习之关键字的示例详解的文章就介绍到这了,更多相关C语言关键字内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2025-4-21 18:05:22 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表