嵌入式C语言面试常问关键字

static关键字

修饰变量

变量分为局部变量和全局变量,都存储在静态区,而普通变量存储在栈区。
静态全局变量作用域仅仅局限于变量被定义的文件中,其他文件不能使用;
静态局部变量只能在函数中使用,同一个文件中其他函数没法使用,它存储在静态区,即使函数结束,这个静态局部变量的值不会被销毁,直到程序结束才会销毁,函数下次使用时仍能使用该值并且保持上次运算结果,默认初始化为0,并且仅初始化一次。

修饰函数

静态函数作用域仅局限于本文件,又称内部函数,不能被其他文件使用,其他文件可以定义相同名字的函数,不会发生冲突。

修饰类

static修饰的内部类相当于一个普通的类,访问方式为(new 外部类名.内部类的方法() )。
静态类只用于包含静态成员的类型,不能实例化,防止继承,防止外部new操作。

const关键字

说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。
只读变量,具有不可变性,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。
"只读",“不可修改”,“必须初始化”

const 与 define 的区别:

  1. define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。
  2. const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏。
  3. const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”。
  4. const定义的只读变量在程序运行过程中只有一份备份,而#define定义的宏常量在内存中有若干备份。

volatile关键字

用它修饰的变量表示可以被某些编译器未知的因素更改,每次使用volatile变量都要从变量地址中读取,直接存取原始内存地址。

在当前线程内,读取一个变量时,为提高存取速度,编译器优化时会把变量读取到一个寄存器中,以后再取变量时直接从寄存器中读取,当变量在当前线程改变时,会同时把变量新值拷贝到该寄存器中以便保持一致,当变量因别的线程改变了值,该寄存器的值不会相应改变,从而造成了应用程序读取的值和实际的变量值不一样。
volatile告诉编译器不要做任何优化,用volatile定义的变量会在程序外改变,必须每次都从原始内存中读取,不能直接使用cache或者寄存器的备份值。

使用volatile变量的例子:

  • 并行设备的硬件寄存器(状态寄存器)
  • 多线程应用中的被多个任务共享的变量
  • 一个中断服务子程序中会访问到的非自动变量

你可能感兴趣的:(C/C++)