C剖析——关键字
关键字
今天剖析一下c语言中的关键字。关键字大家都不陌生,但是你们能说出有多少个关键字么?或者说这些关键字都是干什么的么?register这个关键字是干嘛的呢?
C语言的关键字有32种,今天来剖析几个特殊的。
在这之前,普及两个概念。这两个概念我之前也不是很清楚,今天才看到一个准备的解释。
定义:所谓定义就是编译器创造一个对象,并为这个对象分配一个内存取上一个名字。
声明:①告诉编译器,这个名词匹配了一块内存,如extern int i
②高速编译器,我这个名字作为预留了,别人地方不能用它
区别:定义创建了对象并且分配了内存,声明没有分配内存
register
register:这个关键字请求编译器尽可能的将变量存放在寄存器而不是内存以提高效率。当然,编译器可以不听。
但是register是有限制的:
register变量必须是一个单个的值,并且其长度应小于或等于整型长度。
register变量可能不存在于内存之中,所以不能使用&
来获取其地址。
static
static关键字主要有三个作用:
修饰变量
静态全局变量:修饰作用域从定义之处开始到文件结尾处结束。
静态局部变量:一般被修饰的变量在函数结束之后也不会被销毁,函数下次还是可以用的。我们来看一个例子:
static int i;
void func1()
{
static int i = 0;//如果第二次函数调用会跳过这里
i++;
}
void func2()
{
i = 0;
i++;
cout << i << endl;
}
int main()
{
func1();
func2();
func2();
}
打印的结果是:1 1
修饰函数
函数前加static关键字使函数成为静态函数,函数的作用域仅限于本文件
c++中static
在c++中的类中声明成员变量为static变量使得变量属于类而不属于对象。类中的static所有对象均可访问。
对该变量的初始化得通过::
进行。
同样,对于成员方法来说,static调用的时候不能通过对象调用,只能通过类名+::
进行调用。
sizeof
sizeof我们一般用到它都是来计算变量所占空间大小。但是在计算变量的时候,其实括号是可以省略的,而计算类型时则不可以。
signed&&unsigned
这两个是用来表示变量正负的,编译器在缺省的情况下一般都默认指定signed类型的。我们来看下面的一个例子:
int main()
{
char a[000];
int i,
for(i=0; i<1000; i计+)
{
a[i]=-1-i;
}
pritf("%d", strlen());
return 0;
}
大家可以大胆的猜测答案是什么。
答案是:255
下面看一下解释:
计算机内部以补码形式存在,a[i]的值从 -1到-128然后就是127到0。0刚好代表字符串结束。
if…else
这里主要注意的就是float类型和0比较。
正确的做法是:
float i = 3.0;
if((i >= -EPSINON)&&(i <= EPSINON))
不要和0.0用 ==
比较!!!!
在C语言中规定,EPSINON为一个定义好的精度,如果一个数落在[0.0 - EPSINON , 0.0 + EPSINON]就认为它的值和零值相同。
volatile
这个关键字我是真的陌生,基本没咋用过。
volatile是易变的、不稳定的意思。volatile关键字告诉编译器变量是可能发生变化的,每次使用必须从内存中取出,而不是寄存器。
参考文献
[1] 陈正冲 石 虎.C语言深度剖析.未出版,2020.7.