美文网首页
5. C语言中的一些关键字

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

作者: 郑行_aover | 来源:发表于2019-01-10 13:05 被阅读0次

    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语言中的一些关键字

          本文链接:https://www.haomeiwen.com/subject/xrmorqtx.html