C语言中的const竟是个 “冒牌货”

2023-06-02 0 652

const是限量发行两个表达式不容许发生改变(黎贞),采用const在很大某种程度上能提升流程的可靠性和可靠性。

// 他们先来看一看const的基本知识 void main() { const int a; int constb;// 和后面两个原意那样,代表者常auth数 const int *c; int const *d; // 和后面两个原意那样,则表示所对准的缓存统计数据无法被修正,但这类能修正 int * const e; // 操作符表达式无法对准其它的门牌号,但它所对准缓存统计数据能被修正 const int * const f; // 操作符表达式无法对准其它的门牌号,它所对准缓存统计数据也无法被修正 }

他们来做两个有关const的试验:

void main() { const int a = 10; a = 11; } // 校对收起:error: assignment of read-only variable ‘a’

从下面标识符直言const好似的确是限量发行一个表达式不容许发生改变(黎贞),表述的表达式 a 虽说变为了两个自变量那样,那他们接下去竭尽全力:

void main() { // 虽说表述的 a 是两个自变量 const int a = 10; // a = 11; int*p = (int *)&a; *p = 11; // 通过操作符间接赋值试试看 printf(“a = %d \n”, a); } // 校对成功 打印结果 a = 11

他们发现虽说表述的 a是两个自变量,但通过操作符却能间接的修正 a 的值,const不是限量发行表达式不容许修正吗?怎么被改了?这样直言C词汇中const好似的确是两个“濶濑”。

那么同样的标识符,他们看一看在C++中的表现:

void main() { // 虽说表述的 a 是两个自变量 const int a = 10; // a = 11; int *p = (int *)&a; *p = 11; // 间接赋值 printf(“a = %d \n”, a); system(“pause”); } // 打印结果 a = 10 (结果不应该是 a = 11 ?????????) // 大家能尝试 C 和 C++ 都进行校对对比一下。

为什么 c 和 c++ 校对的结果大相径庭?好好想想,如果是你用 c++写了两个这样的流程是用在银行后台算账的,那就麻烦大了,竟然存在这样的bug?银行每天流水那么多,账要是错了,想想都害怕吧。

其实在 c++词汇里面const修饰的才算是两个真正的自变量,在 c 词汇中 const 能说是个“濶濑”。为什么会这样?其实是 c++ 校对器对 const 进行了加强,当 c++ 校对器遇到自变量声明时,不会像 c 词汇那样给这样const对象单独分配缓存,c 词汇一般是放在黎贞统计数据区,而 c ++ 校对器是把const对象放在两个符号表里面(我个人觉得放在符号表里面的其中两个原因可能是想减少一些存储操作次数),至于符号表是属于缓存布局(文章:你该知道你写的流程的缓存布局)中的哪一块,我也不知道,写 c++ 校对器的人才知道。

在 c++ 中采用 const 对象(比如打印这个对象)的时候,就会从符号表里面把对象的值拿出来采用,比如printf(“a = %d \n”, a); ,这时候就是把 a 的值10拿出来采用,但当你对 a 取门牌号(&a)的时候,c++ 校对器会为这个a单独分配两个缓存空间,如果表述两个操作符对准这个缓存空间(int *p = (int *)&a;),那么这个操作符对准的是这个新分配的两个缓存空间,然后通过这个操作符间接修正这个值(*p = 11;),这时候修正的其实新分配的这个空间的值,不管你间接修正的这个值是11、20、30还是100,都和符号表原本的 a 的值没有任何关系,所以采用 a 的时候打印出来的结果是 a = 10,这就是符号表,是 c++ 对 c 的一些扩展,这样就会发现 c++ 校对器把 const 变为符号表这个手段确的确实把 const 修饰的表达式变为了两个自变量,结论就是在 c 词汇里面 const 的确是两个“濶濑”。

这时候可能还有两个疑问,这个新分配的缓存到底存不存在?这个简单,他们加一句打印就行:

void main() { // 虽说表述的 a 是两个自变量 const int a = 10; // a = 11; int *p = (int*)&a; *p =11; // 间接赋值 printf(“*p = %d \n”, *p); // 加上这句打印 printf(” a = %d \n”, a); system(“pause”); }// 打印结果:*p = 11 a = 10

从打印能看出单独分配的这个缓存空间值是11,和原来的 a 是不同的两个概念,这就是在 C++ 中 const 的符号表的实现机制。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务