一、C语言中的const

  1. const修饰的变量是只读的,本质还是变量;
  2. const修饰的局部变量在栈上分配空间;
  3. const修饰的全局变量在只读存储区分配空间;
  4. const只在编译期有用,在运行期无用;
  5. const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边;例如可以通过指针修改该变量的值。
  6. const将具有全局生命周期的变量存储于只读存储区。const不能定义真正意义上的常量。
  7. c语言的常量只有用enum定义的。

下面两图就很好的展示了上面几点:图1是代码,图2是图1的执行结果。

第3课-进化后的const分析

图1

第3课-进化后的const分析

图2

二、C++中的const

  1. 当const声明变量时,将会在符号表中放入常量的值;
  2. 编译过程中若发现使用常量时,则直接用符号表中的值替换;
  3. 编译过程中若发现下述情况则会给对应的常量分配存储空间;

                       对const常量使用了extern;

                       对const常量使用&操作符;

    4.C++编译器虽然可能为const常量分配空间,但不会使用该空间中的值。如下图所示:

第3课-进化后的const分析

图3

从图3中可看出在编译时,会把c的值0存入符号表,在后面打印c的值就用符号表中的值替换c。

三、C++中的const与宏

  1. C++中的const常量类似于宏定义;

       例如const int c=5;类似于#define c 5;

  1. const常量是由编译器处理的,编译器对const常量进行了类型检查和作用域检查;
  2. 宏定义则由预处理处理,单纯的文本替换。

     下图将会解释以上几点

第3课-进化后的const分析

图4

图4的代码若用C语言编译器将会报错,因为19行中的A和B是变量不是确定的值,所以报错。如图5所示:

第3课-进化后的const分析

图5

图4的代码若用C++语言编译器则运行正常,因为A和B是常量了,而g()函数中a则用在f()中的宏定义替换。如图6所示;如果g()中的第12行去掉注释则编译就会报错,因为f()中的const int a =4;只在f()中起作用。如图7所示。第3课-进化后的const分析

图6

第3课-进化后的const分析

图7

 

相关文章: