zoukankan      html  css  js  c++  java
  • 关键字static、const、volatile的作用

    关键字static的作用是什么?
    这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
    1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    2、 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
    3、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
    大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。做为一个合格的软件工程师,我们要懂得第三部分的作用,要懂得本地化数据和代码范围的好处和重要性。

    int testStatic()
    {
     int x=1;
     x++;
     return x;
    }
    main()
    {
     int i;
     for(i=0;i<5;i++)
     printf("%d/n",testStatic());
    }

    输出为:

    2

    2

    2

    2

    2

     

    int testStatic()
    {
     static  int x=1;
     x++;
     return x;
    }
    main()
    {
     int i;
     for(i=0;i<5;i++)
     printf("%d/n",testStatic());
    }

    输出为:

    2

    3

    4

    5

    6

    const 有什么用途?

    1)可以定义 const 常量

    2const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
      const意味着"只读"。区别如下代码的功能非常重要。

    const int a;
    int const a;
    const int *a;
    int * const a;
    int const * a const;
    • 前两个作用是一样的,a是一个常整型数。
    • 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
    • 第四个意思是a是一个指向整型数的常指针(也就是,指针指向的整型数是可以修改的,但指针是不可修改的)。
    • 最后一个意味着a是一个指向常整型数的常指针(也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的)。


      (1)关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于"输入参数"。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。

      (2)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。

      const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:

    const int SIZE = 10;
    char a[SIZE]; /* 非法:编译阶段不能用到变量 */

    以下是工作中的使用const例子:

    const unsigned char *  pbyData;

    unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
    31, 31, 30, 31, 30, 31 } ;

    extern void dp_write_dsp_block ( const word *bp, word len );

    const unsigned short  cnstUni2InterMapSparseIdx[];

    volatile问题:

    volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自作出有关数据的任何假设——在优化起家这是特别重要的。如果编译器说:“我已经吧数据读入寄存器,而且在没有与寄存器接触。”在一般情况下,它不需要再读入这个数据。但是,如果数据是volatile修饰的,编译器则是不能做出这样的假定,因为数据可能被其他进程改变了,编译器必须重新读这个数据而不是优化这个代码。就像建立const对象一样,程序员也可以建立volatile对象,甚至还建立const volatile对象。这个对象不能被程序员改变,但可通过外面的工具改变。

        volatile对象每次被访问时必须重新读取这个变量的值,而不是用保存在寄存器中的备份。下面时volatile变量的几个例子:

        .并行设备的硬件寄存器(如状态寄存器);

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

        .多现成应用中被几个任务共享的变量。

    一个参数可以const同时也是volatile,一个指针也是可以为volatile的,但是具体编程时要小心,要保证不被意外修改。

  • 相关阅读:
    ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考
    ASP.NET Core 中文文档 第四章 MVC(3.1)视图概述
    ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
    ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
    ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定
    ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
    mysql 解除正在死锁的状态
    基于原生JS的jsonp方法的实现
    HTML 如何显示英文单、双引号
    win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装、优化、安全等)
  • 原文地址:https://www.cnblogs.com/liang123/p/6325754.html
Copyright © 2011-2022 走看看