关于C语言中32个关键字的详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_26940175/article/details/51602798

C语言关键字的详解:

讲解之前先明确两个概念:

什么是定义?什么是声明?它们有何区别?

例如:
A)int i;
B)extern int i;(关于extern,后面解释)

哪个是定义?哪个是声明?或者都是定义或者都是声明?

什么是定义:

所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊。^_^),它们就同生共死,终生不离不弃。并且这块内存的位置也不能被改变。一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。

什么是声明:

有两重含义,如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了(伊人已嫁,吾将何去何从?何以解忧,唯有稀粥),下面的代码用到变量或对象是在别的地方定义的。声明可以出
现多次。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。比如你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预
订,别人再也不允许使用这个座位。其实这个时候你本人并没有坐在这个座位上。这种声明最典型的例子就是函数参数的声明,例如:
void fun(int i, char c);

好,这样一解释,我们可以很清楚的判断:A)是定义;B)是声明。

0.extern 声明变量是在其他文件正声明(也可以看做是引用变量)
1.return 子程序返回语句(可以带参数,也可不带参数)
2.void 声明函数无返回值或无参数,声明空类型指针
3.continue 结束当前循环,开始下一轮循环
4.do 循环语句的循环体
5.while 循环语句的循环条件
6.if 条件语句
7.else 条件语句否定分支(与if 连用)
8.for 一种循环语句(可意会不可言传)
9.goto 无条件跳转语句
10.sizeof 计算对象所占内存空间大小,对象分配了内存,声明没有分配内存(一个抱伊人,一个喝稀粥)
11.auto 声明自动变量,缺省时编译器一般默认为auto

 
最宽恒大量的关键字----auto
auto:它很宽恒大量的,你就当它不存在吧。编译器在默认的缺省情况下,所有变量都是auto 的。
 

12.int 声明整型变量 13.double 声明双精度变量 14.long 声明长整型变量 15.char 声明字符型变量 16.float 声明浮点型变量 17.short 声明短整型变量

 

基本数据类型----short、int、long、char、float、double
关键字----static
C数据类型:  	1.基本类型:	a.数值类型	->整数		短整型 short
								整形   int
								长整形 long
						->浮点型	单精度	float
								双精度	double
				b.符号类型			char
     		2.构造类型			->数组
						->结构体		struct
						->共用体		union
						->枚举类型		enum
	3.指针类型					
		4.空类型					void
 
 
 

18.signed 声明有符号类型变量19.unsigned 声明无符号类型变量20.struct 声明结构体变量21.union 声明联合数据类型22.enum 声明枚举类型23.static 声明静态变量

最名不符实的关键字----static
不要误以为关键字static 很安静,其实它一点也不安静。这个关键字在C 语言里主要有两个作用,C++对它进行了扩展。
 
1.修饰变量: 
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern ***。恶心吧?要想不恶心,很简单,直接在文件顶端定义不就得了。
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
static int j;
void fun1(void){
	static int i = 0;
	i ++;
}
void fun2(void){
	j = 0;
	j++;
}
int main(){
	for(k=0; k<10; k++){
	fun1();
	fun2();
	}
	return 0;
}
i 和j 的值分别是什么,为什么?

2.修饰函数
第二个作用:修饰函数。函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
关键字static 有着不寻常的历史。起初,在C 中引入关键字static 是为了表示退出一个块后仍然存在的局部变量。随后,static 在C 中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static 关键字来表示这第二 
种含义。当然,C++里对static 赋予了第三个作用,这里先不讨论,有兴趣的可以找相关资料研究。
 
数据类型与“模子”
short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。
怎么去理解它们呢? 举个例子:见过藕煤球的那个东西吧?(没见过?煤球总见过吧)。那个东西叫藕煤器,拿着它在和好的煤堆里这么一咔,一个煤球出来了。半径12cm,12 个孔。不同型号的藕煤器咔出来的煤球大小不一样,孔数也不一样。这个藕煤器其实就是个模子。现在我们联想一下,short、int、long、char、float、double 这六个东东是不是很像不同类型的藕煤器啊?拿着它们在内存上咔咔咔,不同大小的内存就分配好了,当然别忘了给它们取个好听的名字。在32 位的系统上short 咔出来的内存大小是2 个byte;int 咔出来的内存大小是4 个byte;long 咔出来的内存大小是4 个byte;float 咔出来的内存大小是4 个byte;double 咔出来的内存大小是8 个byte;char 咔出来的内存大小是1 个byte。(注意这里指一般情况,可能不同的平台还会有所不同,具体平台可以用sizeof 关键字测试一下)很简单吧?咔咔咔很爽吧?是很简单,也确实很爽,但问题就是你咔出来这么多内存块,你总不能给他取名字叫做x1,x2,x3,x4,x5…或者长江1 号,长江2 号…吧。它们长得这么像(不是你家的老大,老二,老三…),过一阵子你就会忘了到底哪个名字和哪个内存块匹配了(到底谁嫁给谁了啊?^_^)。所以呢,给他们取一个好的名字绝对重要。下面我们就来研究研究取什么样的名字好。
 
 

24.switch 用于开关语句
25.case 开关语句分支
26.default 开关语句中的“其他”分支
27.break 跳出当前循环
28.register 声明寄存器变量

 
最快的关键字---- register
register:这个关键字请求编译器尽可能的将变量存在CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么
几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。
 
皇帝身边的小太监----寄存器
CPU 是我们的皇帝同志.大臣就相当于我们的内存,数据从他这拿出来。那小太监就是我们的寄存器了(这里先不考虑CPU 的高速缓存区)。数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。这里要说明的一点是:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝同志,但寄存器没这么自觉,它从不主动干什么事。一个皇帝可能有好些小太监,那么一个CPU 也可以有很多寄存器,不同型号的CPU 拥有寄存器的数量不一样。为啥要这么麻烦啊?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。进水楼台先得月嘛,它离CPU 很近,CPU 一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!
 
使用register 修饰符的注意点:
虽然寄存器的速度非常快,但是使用register 修饰符也有些限制的:register 变量必须是能被CPU 寄存器所接受的类型。意味着register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register 变量可能不存放在内存中,所以不能用取址运算符“&”来获取register 变量的地址。

29.const 声明只读变量 30.volatile 说明变量在程序执行中可被隐含地改变< 关键 > 31.typedef 用以给数据类型取别名(当然还有其他作用)

 

猜你喜欢

转载自blog.csdn.net/sinat_26940175/article/details/51602798
今日推荐