C语言初学者必须掌握的关键字!

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

C语言关键字总结

static关键字C语言

const关键字C语言

register关键字用法

auto关键字

inline内联函数

static关键字 

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

1、局部变量:

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

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

例如:

输出结果:

2、全局变量: 

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

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

3、函数: 

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

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

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

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

小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:870963251!适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程

const关键字 

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

1、用const修饰一般变量 

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

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

2、const与指针搭配使用 

两个基础概念:指针常量和常量指针

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

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

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

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

注意:

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

register关键字用法

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修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。

auto关键字

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

inline内联函数

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

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

优点: 

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

缺点: 

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

总结:

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

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏aCloudDeveloper

从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

Top N问题在搜索引擎、推荐系统领域应用很广, 如果用我们较为常见的语言,如C、C++、Java等,代码量至少也得五行,但是用Python的话,只用一个函数就...

252100
来自专栏程序猿

枚举算法(Enumeration algorithm)实例一

(建议电脑看原文链接,平台的排版不太好,太累了。)描述:在n位的整数中,例如153可以满足1^3 + 5^3 + 3^3 = 153,这样的数称...

39660
来自专栏Modeng的专栏

Javascript数组系列一之栈与队列

所谓数组(英语:Array),是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。 组成数组的各个变量称为数组的分量,也称为数组的元素...

15650
来自专栏小俊博客

Nginx的location规则迷之匹配

Nginx,一个改变世界的软件,其作者是一个俄罗斯人,俗称毛子,在国人的印象中,是一群晚饭后牵着大灰熊在小区楼下散步的彪汉。能写出这般顺滑的软件,可谓是心有猛虎...

72020
来自专栏微信公众号:Java团长

Java集合框架综述

最近打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一...

10330
来自专栏Albert陈凯

编译型语言、解释型语言、静态类型语言、动态类型语言、强类型语言、弱类型语言概念与区别

编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(li...

470110
来自专栏GreenLeaves

C# 泛型

1、泛型的优势 在日常开发中,我们经常会开发一些特殊的功能,而这个功能适用于多个类型(比如string,int等多种类型),最简单的做法是给每种类型都做一个实现...

203100
来自专栏奇点大数据

Scala语言学习笔记一

Scala是一门小众的语言,但是作者因为工作原因要以Spark作为工作中的一个重心,而Spark采用了Scala语言编写,于是萌生了认真学习Scala的念头,在...

37540
来自专栏叁金大数据

自学Python六 爬虫基础必不可少的正则

  要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下...

9910
来自专栏小樱的经验随笔

数据结构学习笔记【持续更新】

数据结构概述:   定义:     我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到保存到主存储器(内存)中,     以及在此基础上为实...

23630

扫码关注云+社区

领取腾讯云代金券