【超全】C语言初学者必须掌握的关键字!

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

C语言关键字总结

static关键字C语言

const关键字C语言

register关键字用法

auto关键字

inline内联函数

static关键字

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

1、局部变量:

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

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

例如:

输出结果:

2、全局变量:

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

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

3、函数:

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

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

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

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

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 关键字,而不是在函数声明时。

优点:

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

缺点:

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

总结:

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

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

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

老九学堂

问:

以下程序段中的变量已正确定义:

for( i=0; i<4; i++,i++ )

for( k=1; k<3; k++ ); printf("*" );

程序段的输出结果是( )。 (C语言)

A) **

B) ****

C) *

D) ********

上期学霸

那逝去的昨天

cinoa

熊大爷

李玮斌

衣绣夜行

上期问题:

下关于逻辑运算符两侧运算对象的叙述中正确的是( )。(C语言)

A) 可以是任意合法的表达式

B) 只能是整数0或非0整数

C) 可以是结构体类型的数据

D) 只能是整数0或1

上期答案: A

解析:C语言的逻辑运算符比较特别,它的操作数没有明确的数据类型,可以是任意合法的表达式,所以选择A)。

原文发布于微信公众号 - 老九学堂(xuetang9)

原文发表时间:2017-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏欧阳大哥的轮子

深入解构iOS系统下的全局对象和初始化函数

事件源于接入了一个第三方库导致应用出现了大量的crash记录,很奇怪的是这么多的crash居然没有收到用户的反馈信息! 在这个过程中每个崩溃栈的信息都明确的指向...

1132
来自专栏jeremy的技术点滴

koa框架源码解读

3348
来自专栏jessetalks

Javascript基础回顾 之(二) 作用域

参数传递的问题   在Javascript中所有的参数传递都是按值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。...

2716
来自专栏诸葛青云的专栏

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

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

130
来自专栏智能算法

Python学习(三)---- 集合、文件操作、字符编码和函数

https://blog.csdn.net/fgf00/article/details/52167245

752
来自专栏我是攻城师

Solr搜索问题笔记(一)

3524
来自专栏司想君

JavaScript闭包,只学这篇就会了

昨天发的文章,排版出现了重大失误。让大家的眼睛受累了。今天再发一遍。 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透...

2648
来自专栏西二旗一哥

iOS - Dissecting objc_msgSend on ARM64

我们的朋友 ldp 又出现了。这回它读取了 x12 中指针,这个指针指向了要查找的bucket。每个bucket包含了一个选择器和一个 IMP 。 x9 现在包...

704
来自专栏闪电gogogo的专栏

Python入门学习(一)

看完了莫烦Python的视频,对于Python有了一点感觉,接下来打算把小甲鱼的视频啃完,附上学习网址:http://blog.fishc.com/catego...

1878
来自专栏CDA数据分析师

超能教程 十分钟学会 Python!

假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程。那么本教程将花费十分钟的时间带你走入Python的大门。本文的内容介于教程(Totur...

1886

扫码关注云+社区