相信这么努力的你 已经星标了我

老九学堂 你身边的IT导师

其实小伙伴在写代码的时候,关键字还是用的比较多的,  今天大雄主要就平常中用到的常用关键字进行总结,便于小伙伴们更全面的理解其在代码中的意图。

C语言关键字总结

static关键字C语言

const关键字C语言

register关键字用法

auto关键字

inline内联函数

01static关键字

static可以用来修饰局部变量、全局变量、函数 

局部变量

生命周期:原先存在栈中,生命周期语句执行完毕便结束了。现在存放到静态数据区,生命周期持续到整个程序执行结束。

作用域:并没有改变作用域,还是仅限于该语句块。并且只在初次运行的时候进行初始化,下次调用时它的值是上一次函数调用结束之后的值。每次调用后值会被保存。

例如:

输出结果:

全局变量

对于一个全部变量,既可以在本源文件中被访问到,也可以在同一个工程的其它源文件中被访问(只需用extern进行声明即可)。

如果加上static,限制该全局变量的作用域范围,由原来的整个工程可见变为本源文件可见。

函数

与修饰全局变量大同小异,就是改变了函数的作用域。

修饰函数时还有一处不同,就是调用静态函数时,函数指针指向的地址始终是固定的,而普通函数每次返回的地址不一样(这条特性是一个工作老手告诉大雄的,还没来得及验证)

extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。另外,用extern会加速程序的编译过程,这样能节省时间。

C++中static还有一些不同,这里就暂时先不讨论。

02const关键字

C语言中保留的一个关键字,它用来限定一个变量是只读的,即不可变的。

用const修饰一般变量

用const修饰的变量必须在声明时进行初始化(用来修饰函数的形参除外)。

一旦一个变量被const修饰后,在程序中除初始化外对这个变量进行的赋值都是错误的。

const与指针搭配使用两个基础概念:指针常量和常量指针

指针常量:即指针本身的值是不可改变的,而指针指向的变量的值是可以改变的;

常量指针:即指针指向的变量的值是不可改变的,而指针本身的值是可以改变的;

如果const在’*’左边,则表示指针指向的变量的值不可变;

如果const在’*’右边,则表示指针的值是不可变的;

注意:

不能显式地通过赋值语句去改变a的值,但是不代表在程序中不能通过其它方法来修改这个值。

03register关键字用法

register:这个关键字请求编译器尽可能的将变量存在CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。

寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。

数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。

有个故事,叫皇帝身边的小太监,挺形象的:

大家都看过电视戏,那些老总们要阅读文件的时候,管理层总是先将奏章交给皇帝旁边的助理,助理呢再交给老总处理。这个小太监只是个中转站,并无别的功能。

好,那我们再联想到我们的CPU。CPU 不就是我们的老总么?管理员就相当于我们的内存,数据从他这拿出来。那助理就是我们的寄存器了(这里先不考虑CPU 的高速缓存区)。

数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。

这里要说明的一点是:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝,但寄存器没这么自觉,它从不主动干什么事。一个皇帝可能有好些小太监,那么一个CPU 也可以有很多寄存器,不同型号的CPU 拥有寄存器的数量不一样。

为啥要这么麻烦啊?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。

进水楼台先得月嘛,它离CPU 很近,CPU 一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!

一些限制

(1)register变量必须是能被CPU所接受的类型。

这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。

(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。

(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。 在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。

(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;

(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。

注意:

  • 早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。

  • 然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。

  • 实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。

04auto关键字

用于声明变量的生存期为自动,所有的变量默认就是auto的。

05inline内联函数

调用函数时需要一定的时间和空间的开销。C++提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(inline function),又称内嵌函数或内置函数。

注意

是在函数定义时增加 inline 关键字,而不是在函数声明时。

优点: 

内联函数可以有效避免函数调用的开销,程序执行效率更高

缺点: 

如果被声明为内联函数的函数体非常大,则编译器编译后程序的可执行码将会变得很大。当内联函数的函数体过大时,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

总结

通常在程序设计过程中,我们会将一些频繁被调用的短小函数声明为内联函数。

调用内联函数和调用正规函数是等价的,差别仅仅是更快

今天的干货小伙伴们都掌握了吗?编程语言的基础一定要掌握牢固,才能在以后编程项目的时候运用如飞哦~

 

最近大雄在思考19年多给小伙伴们推出一点喜欢的知识,但是不知道小伙伴们日常喜欢看些什么内容呢?

2019,你想要的老九学堂公众号是什么样呢?

赶紧参与下方投票告诉大雄哟~(为期一周)

年前预定享优惠,点击“阅读原文”,立即预约线下班。

c语言关键字_C语言初学者必须掌握的关键字!相关推荐

  1. c语言是静态语言python语言是脚本语言吗_C语言还是Python语言哪个更好?

    最近,很多人问我问题. C语言还是Python,哪个更好?实际上,没有什么好坏之分,而且由于Python的基本逻辑是用C语言实现的,因此它们都有自己的特点.如果您想了解更多信息,建议您先学习C语言,然 ...

  2. tail -f 查找关键字_C语言九种查找算法 | 总有一款适合你

    时间.空间复杂度比较 查找算法 平均时间复杂度 空间复杂度 查找条件 顺序查找 O(n) O(1) 无序或有序 二分查找(折半查找) O(log2n) O(1) 有序 插值查找 O(log2(log2 ...

  3. c++枚举和c语言枚举_C语言枚举初学者指南

    c++枚举和c语言枚举 Hey, folks! Hope you all are doing well. In this article, we will be discussing Enumerat ...

  4. 棱形旋转c语言程序_C 语言时隔 5 年重回巅峰,这 20 个热门项目拿去练手!

    在上个月的 TIOBE 编程语言排名中,C 语言和 Java 的差距只有 0.01%.在近日 TIOBE 公布的 2020 年 5 月编程语言排行榜中,C 语言成功超越了 Java,重返第一的王者宝座 ...

  5. 蜂鸣器发出7种音阶c语言程序_C语言编程新思路

    第一章 单元测试 1.单选题: 关于一个C语言程序执行的起点和终点,以下选项正确的是 ( ). 选项: A: main 任意 B: main 最后一个 C: main main D: 第一个 最后一个 ...

  6. 函数c语言表示_C语言定义无参数的函数时,f()和f(void)有什么区别?

    相信C语言初学者常会在前辈留下的项目,或者一些开源项目中看到以 void 作为参数的函数,例如 void fun(void),虽然我们都明白在C语言中,"void"表示空,但是按理 ...

  7. drl 规则语言 语法_C语言基本语法规则

    drl 规则语言 语法 C language syntax specify rules for sequence of characters to be written in C language. ...

  8. 第四章 C语言输入输出_C语言数据输出大汇总以及轻量进阶

    在C语言中,有三个函数可以用来在显示器上输出数据,它们分别是: puts():只能输出字符串,并且输出结束后会自动换行,在<第一个C语言程序>中已经进行了介绍. putchar():只能输 ...

  9. 第六章 C语言数组_C语言变长数组:使用变量指明数组的长度

    在<C语言的三套标准:C89.C99和C11>一节中我们讲到,目前经常使用的C语言有三个版本,分别是 C89.C99 和 C11.C89(也称 ANSI C)是较早的版本,也是最经典的版本 ...

最新文章

  1. 牛客网在线编程之“字符串分割”
  2. 使用 Go 实现生产者和消费者,Kafka 正式升级到 3.0!
  3. 颜宁:当科学家是幸福的
  4. hdu 3549 最大流(EK实现)
  5. linux下用grep命令根据文件内容进行关键字搜索[linux ubuntu grep] -转
  6. C/C++训练项目一:2048
  7. 无线RTU 数据采集 远程测控
  8. STM32F429第二篇之推挽输出与开漏输出
  9. 工作一周年,带你认识杭州最好的电商公司
  10. 2022年深圳市高新技术企业认定奖励补贴以及可以享受的政策有哪些?
  11. 身份证有效验证方法,
  12. 第二章第三题(将英尺转换为米)(convert feet to meters)
  13. 帅某---考研---高数笔记---汤家凤---第十章向量代数与空间几何
  14. video 播放视频被x5内核浏览器劫持时的处理记录
  15. cad零点坐标标注lisp_CAD_XY坐标标注AUTO_LISP程序
  16. 程序员不得不学的操作系统知识(一)
  17. Linux下怎么让挂起的(suspend or stopped)进程恢复执行(resume)
  18. 持续集成(第二版) Martin Fowler著
  19. python打造记账本_python实现日常记账本小程序
  20. HBase的数据热点和Hbase常见避免热点问题的方法

热门文章

  1. build-android-in-OS-X-Yosemite-Xcode-7
  2. jsp实现邮件的发送
  3. C/C++基础面试题集锦
  4. VM 7 下ubuntu安装vmtools
  5. Redis官方的高可用性解决方案
  6. 卡方检验 python
  7. 「JOISC 2016 Day 3」回转寿司
  8. vertx核心类之VertxImpl
  9. Spring aop 实现异常拦截
  10. C#基础知识(个人笔记)