C语言之关键字(一)

C语言多少个keyword?是的,就是32个,sizeof是其中之一(具体是哪32个可以百度一下,这里略),详细可以见上一篇《sizeof知多少》中。同样,我们还是以问题及标题的形式组织文章思路

1 声明与定义的区别?

1) int i;

2) extern int i

他们分别是什么?声明 or定义?

直接来概念

什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。一个变量或对象在一定的区
域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。
什么是声明:有两重含义,如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到变量或对象是在别的地方定义的。声明可以出现多次。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。这种声明最典型的例子就是函数参数的声明,例如:
void fun(int i, char c);
好,这样一解释,我们可以很清楚的判断:A)是定义;B)是声明。

所以,定义与声明的区别在于:定义分配好内存,而声明只是宣称了所有权,没有真正的内存空间或者是告诉该东西在其他地方定义了,我直接用就OK的。

恩,理解完这个后,我们就直接就一些关键字进行一个简单的介绍

2 auto—— 最没存在感的关键字

编译器在默认的缺省情况下,所有变量都是auto的。

3 register——最快被cpu宠幸的关键字

被register修饰的变量会尽量直接放在cpu内部的寄存器,而不是通过内存寻址来访问。因为平时我们定义的变量都是在内存中,而cpu不能直接与内存打交道,需要通过总线来将内存中的变量数据取到寄存器中,而cpu直接与寄存器打交道。所以,要注意,register变量不能使用取地址&来对他进行一些操作,因为他不在内存啊,&是针对存放在内存中的。但是注意开头说的是尽量放在寄存器中,而不是绝对的,因为我们知道一个系统的寄存器是有限的,例如16个,32个什么的,并且他长度是固定的。所以如果我们使劲的将很多变量声明为register,根本就没那么多寄存器可以放,轮也轮不到。并且因为寄存器长度的限制,所以register声明的变量只能是单个的值,不能大于其长度限制。

4 static——只是生存期长了而已,加上它限制了只能本文件用,应该叫longLife的

说static,就必须说全局变量,局部变量,静态全局变量,静态局部变量

全局变量:就是在某个源文件中定义了,可以在其他源文件中使用它们,只要在其他要使用他的源文件中加个extern就可以了。

局部变量:就是作用范围是局部的,在某个函数中定义的,在这个函数执行完之后,他也就消失了。

static全局变量:就是在全局变量前边加了个static,但加上了这个static,他就限制了这个变量损失了原来全局变量在其他文件中可见的特性,而是从这个变量定义的地方到这个源文件结束都可以用,但是其他源文件不可以用,但是注意,虽然不可以用,但是该static变量并不是定义他的文件执行完就结束。而是一直存在到程序结束。

static局部变量:首先他依旧是一个局部变量,作用范围还是函数内部,只是他是放在静态区域,直到程序结束时候生命才完结

从内存方面看,全局变量,静态全局变量,静态局部变量都是存在于内存的静态区,而静态区意味着其生命周期是从定义他开始的地方到程序结束。而局部变量存在与内存的栈上。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。这是他与全局变量的区别

1)  静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)  变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别

所以, static 全局变量:改变作用范围,不改变存储位置
              static 局部变量:改变存储位置,不改变作用范围

同样,static不仅可以修饰变量,还可以修饰函数

函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

所以总的来说,static的作用就是限制了范围,只能在本文件中使用, 同时保持跟程序一样长的生命周期

5 signed ,unsigned关键字

这个应该比较简单,就是是否将最高位特殊出来存放符号,如果是signed,那么char 型表示值的范围是-27~27-1 ,int型为-231~231-1,其他类似,而对于unsigned的char为

0~28-1,int 为0~232-1,其他类似

6 bool关键字——if(flag)及if(!flag)比较好

我们知道,bool值如果为false的话,在编译器中是被定义成0,而如果是true的话,不同的编译器是不同的,当然有一点是确定的,就是不为0。

那么我们平时在做一些判断时候怎么写比较好呢? 看下

bool Flag = FALSE;//一般初始化为FALSE比较好,因为他是0,因为我们之前说过,一般定义一个变量时候要初始化是一个好习惯
A)  if(Flag == 0); if(Flag == 1) or if(Flag!=0);
B )  if(Flag); if(!Flag);

尽管第一种写法在一些编译器上是没错的,但是这样写不是很好,很容易让人家误认为Flag是一个整数,而不是布尔值。

推荐B的写法,不会引起误会,也不会因为TRUE在不同的编译器中定义的不同。

7   float 变量与“零值”怎么比较

我们知道,float与double都是有精度的,而一般对于浮点数等,我们在数学等课中也知道一般是定义一个精度的,只要结果不超过精度范围,那么便认为是对的。

同样,在语言中,我们可以定义一个变量(更好的用宏)EPSON为我们需要精确的精度,然后只要float变量在【0-EPSON,EPSON】之间,那么我们就认为这个float为0值。如下 : if( (fVar<=EPSON) && (fVar>=-EPSOn) )

8  指针变量怎么与0值比较

nt*p=NULL;//定义指针一定要同时初始化
A), if(p == 0); if(p != 0);
B), if(p); if(!p);
C) , if(NULL == p); if(NULL != p);
哪一组或是那些组正确呢?
A)写法:p是整型变量?容易引起误会,不好。尽管NULL的值和0一样,但意义不同。
B)写法:p是bool型变量?容易引起误会,不好。
C)写法:这个写法才是正确的,但样子比较古怪。为什么要这么写呢?是怕漏写一个“=”号:if(p = NULL),这个表达式编译器当然会认为是正确的,但却不是你要表达的意思。
所以,非常推荐这种写法。

好,今天先到这里,下一篇会介绍比较难的void.const等



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值