C++第3课:进化后的const分析

本文学习自 狄泰软件学院 唐佐林老师的 C++课程


在这里插入图片描述
在这里插入图片描述
C语言中只有枚举可以定义真正意义上的常量。const变量只是表示他不能在编译期间出现再赋值符号的左边

实验1:C语言中的const只读变量

main.c

#include <stdio.h>

int main()
{
	/*
	定义了一个局部变量,并且被const修饰,具有只读属性,注意
	它只是一个只读变量,并不是一个真正意义上的常量。他本质还是一个变量,在栈上分配内存空间。
	*/
    const int c = 0;
    int* p = (int*)&c;//通过用指针指向只读变量的内存空间 改变只读变量
    
    printf("Begin...\n");
    
    *p = 5;
    
    printf("c = %d\n", c);
    
    printf("End...\n");
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述

为其分配空间但不使用,是为了兼容C语言编译器

在这里插入图片描述

实验2 C++中的const只读变量

main.cpp

int main()
{
	/*
定义一个const常量,存储于符号表
	*/
    const int c = 0;
/* 为 被&修饰的const常量 分配一个空间,但是不会主动使用他,只是为了兼容C语言 */
    int* p = (int*)&c;
    
    printf("Begin...\n");
    
    /* 此处的修改 只是改变了上面分配的空间,并不会改变符号表中的C值 */
    *p = 5;
    
    printf("c = %d\n", c);
    
    printf("End...\n");
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实验3:const 与宏的区别

main.c

#include <stdio.h>

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
/*
这里 g() 中调用 f()中定义的宏,居然没有报错 编译通过!!! 原因在于 宏是预处理器所处理的,直接进
行文本替换,编译器根本不知道宏的存在,也就是说编译器在这里看到的是  printf("a = %d\n", 3);
*/
    printf("a = %d\n", a);
    //printf("b = %d\n", b);
}

int main()
{
    const int A = 1;
    const int B = 2;
/*
	这里报错:C语言中 A 和 B 是只读变量,属于变量,此处定义的数组大小为A+B。A+B也是变量。变
	量是什么只有在运行的时候才知道,所以编译器看不懂 这个数组的大小是多少  直接报错!
*/
    int array[A + B] = {0};
    int i = 0;
    
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    f();
    g();
    
    return 0;
}

main.cpp

#include <stdio.h>

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
	/*
	这里报错:C语言中 A 和 B 是只读变量,属于变量,此处定义的数组大小为A+B。A+B也是变量。变
	量是什么只有在运行的时候才知道,所以编译器看不懂 这个数组的大小是多少  直接报错!
	*/
    printf("a = %d\n", a);

	/*
	 如果加上这行代码,在c++中是编译不过的,原因在于,此处C++编译期会对const常量进行类型检查
	和作用域检查,此时编译器发现 b的作用域在 f()内部才有效。报错 b不在当前作用域。
	 */
    printf("b = %d\n", b);
}

int main()
{
    const int A = 1;
    const int B = 2;
/*
	这里没有报错:因为C++中这里A B 都是常量,编译器可以确认该数组的大小。
*/
    int array[A + B] = {0};
    int i = 0;
    
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    f();
    g();
    
    return 0;
}

在这里插入图片描述

发布了200 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/104086804