C语言基础面试题之关键字

static关键字

  1. static关键字的作用是什么?
    这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
    1)在函数体中,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数访问。他是一个本地的全局变量。
    3)在模块内,一个被声明为静态的函数只可能被这一模块内的其他函数调用,那就是这个函数被限制在声明它的模块的本地范围内使用。
  2. static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
      从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
      static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
    对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
      static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
      static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
      static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

const关键字

const int a; 
int const a;    //前两个的作用是一样,a是一个常整型数。
const int *a;   //a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以
int * const a;  //a是一个指向整型数的常指针 (也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)
int const * a const;  //a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

为何用const:
1). 关键字const的作用,告诉别人是只读的常量。
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

Volatile关键字

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

define关键字

  1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 

我在这想看到几件事情:
1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

  1. 写一个“标准”宏,这个宏输入两个参数并返回较小的一个
#define Min(X, Y) ((X)>(Y)?(Y):(X))     //宏中小心地把参数用括号括起来
  1. 不用中间变量,实现两变量的交换
#define swap(x,y) \
									x=x+y;\
									y=x-y;\
									x=x-y    //注意:结尾没有分号
  1. const与#define 相比,有何优点?
    const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
    有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。
  2. inline 和define 对比
    inline代码放入预编译器符号表中,高效;它是个真正的函数,调用时有严格的参数检测。

你可能感兴趣的:(C语言基础面试题之关键字)