• 第3课 进化后的 const分析


    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...
    ");
    
        *p = 5;  //内存中的值己被改为5.
    
        printf("c = %d
    ", c);//C语言会输出内存中的5.
                              //C++中会从符号表(而不是内存)中取值
                              //所以为0.
    
        printf("End...
    ");
        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
    ", a); //合法,只要是宏定义之后都可以使用
        
        //printf("b = %d
    ", 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
    ", i, array[i]);
        }
    
        f();
        g();
    
        return 0;
    }

    5. 小结

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

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

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

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

  • 相关阅读:
    PAT2019顶级7-2:美丽的序列(线段树+DP)
    ZOJ2112 Dynamic Rank(可持久化线段树套树状数组)
    CF1353E K-periodic Garland(动态规划)
    CF1353D Constructing the array(优先队列)
    HDU2069 Coin Change(基础DP)
    surf(树状数组+DP)
    双倍快乐(回文树)
    ZOJ3591 Nim(博弈论)
    HDU6601 Keep On EveryThing But Triangle(可持久化线段树)
    HDU6599 I Love Palindrome String(回文树)
  • 原文地址:https://www.cnblogs.com/5iedu/p/5366223.html
Copyright © 2020-2023  润新知