5. C语言中的一些关键字

1. static

static的产生背景:

我们都知道函数内部定义的变量,分配在栈空间上,栈上分配的空间伴随着函数的结束而释放。此时产生一个问题,如果想将函数中的此值保存至下一次调用时,该如何实现?为此,引入了static关键字,修饰变量,告诉编译器让其分配在静态存储区,这样既实现了目的,又使得此变量的作用范围不变。

作用总结:

1. static使得变量或对象的存储变成静态存储,在函数体内修改,改变其存储方式。

连接方式为内部连接,在全局变量上修饰,改变其连接方式,也即作用范围。

2. const

2.1 const的产生背景:

1. C++是一个类型严格的编译系统,使得C++程序的错误在编译阶段就可发现,使得出错率降低,这是C++比C优势的地方。

2. C中有很常见的预处理指令 #define room_number 412 ,可以很方便的进行替代,这种替代有三方面的优点

避免了意义模糊的数字出现,使得程序的语义更流畅

可以很方便的进行参数调整

提高了程序的执行效率,使用了预编译进行值替代

但是伴随着缺点:

预处理语句仅仅是进行简单的替代,缺乏类型检测机制。这样预处理就不能享受C++的严格的类型检测,称为隐患。

const推出的目的,就是为了取代预编译指令,消除它的缺点,同时集成其优点。

2.2 const的具体作用

1. const用于指针情况分析

int const *A            //A可变, *A不可变,即指针指向的内容不可变,指针的值可变。

int *const A           //A不可变,*A可变,  即指针的值不变,指向的内容可变。

2. const限定函数的传递值参数:

    void  FUNC(const     int Var);

    限定参数在函数体中不可被改变。

3. const 限定函数的值型号返回值

const int Fun1();

const MyClass Fun2();

     分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如Fun1),已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的类型时(如Fun2),这个类型仍然包含可以被赋值的变量成员,所以,此时有意义

4. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意义昭然。

5.  const 限定类的成员函数:

class ClassName {

 public:

  int Fun() const;

 .....

}

  注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。

获得能力:可以操作常量对象。

失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。


3. volatile 关键字

volatile 的产生背景,当一个值需要多方共同使用时候,一方进行了更新,但是另一方使用的时候,却发生数值仍然是原来的值,而非最新值,究其原因,是因为编译器进行了优化,并没有实时的更新此值。

为了解决这个问题,引入了volatile关键字,告诉编译器不要对此做优化。每次读取更改变量都是“直接存取原始内存地址。

下面是volatile变量的几个例子:

1)并行设备的硬件寄存器(如:状态寄存器)

2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3)多线程应用中被几个任务共享的变量\

这是区分C程序员和嵌入式系统程序员的最基本的问题:嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所有这些都要求使用volatile变量。不懂得volatile内容将会带来灾难。

你可能感兴趣的:(5. C语言中的一些关键字)