浅墨浓香

想要天亮进城,就得天黑赶路。

导航

第3课 进化后的 const分析

Posted on 2016-04-08 00:03  浅墨浓香  阅读(522)  评论(0编辑  收藏  举报

1.  C语言中的const

(1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量。所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。

(2)const修饰的局部变量栈上分配空间全局变量只读存储区分配空间

(3)const只在编译期有用,在运行期无用

【编程实验】C/C++中的const

#include <stdio.h>

int main()
{
    const int c = 0;   //C语言中会为变量c分配内存
    int* p = (int*)&c; //C++中遇到&才为c分配内存

    printf("Begin...\n");

    *p = 5;  //内存中的值己被改为5.

    printf("c = %d\n", c);//C语言会输出内存中的5.
                          //C++中会从符号表(而不是内存)中取值
                          //所以为0.

    printf("End...\n");
    return 0;
}

2. C++中的const

(1)C++在C的基础上对const进行了优先处理,当碰见const声明时在符号表中放入常量。

(2)编译过程中若发现使用常量,则直接以符号表中的值替换

 

(3)编译过程中若发现对const常量使用了extern&操作符,则会给对应的常量分配存储空间。注意,C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

3. 对比C/C++中的const

 

C语言

C++

本质

只读变量

常量

分配内存

会分配

当使用&操作符对const常量取地址时分配

当const常量为全局,并且需要在其它文件中使用时会分配内存

4. C++中的const与宏的区别

 

C++中的const

定义

const int c = 5;

#define c 5

处理方式

编译器处理,编译器会进行类型检查作用域检查

预处理器处理,只是简单的文本替换

【编程实验】const与宏

#include <stdio.h>

void f()
{
    //宏由预编译处理,其后面的宏起作用
    #define a 3

    const int b = 4;//作用域仅限于f函数
}

void g()
{
    printf("a = %d\n", a); //合法,只要是宏定义之后都可以使用
    
    //printf("b = %d\n", b); //非法b的作用域仅限于f函数
}

int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0};//C++中合法,因为它认为A、B都是常量。
                           //而C语言的const本质还是变量,数组大小只能是常量

    int i = 0;

    for(i=0;i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }

    f();
    g();

    return 0;
}

5. 小结

(1)与C语言不同,C++中的const不是只读变量

(2)C++中的const是一个真正意义上的常量

(3)C++编译器可能会为const常量分配空间

(4)C++完全兼容C语言中的const常量的语法特性