C与C++对const关键字理解
  BEWlHYGDL6xD 2023年11月15日 44 0
#include <stdio.h>

int main()
{
    const int a = 2;
    int* p = (int*)&a;
    *p = 5;
    printf("%d\n", a);
    return 0;
}

C编译后的结果:

gcc -o const.exe const.c

C与C++对const关键字理解_amp

C++编译后的结果

g++ -o const.exe const.c

C与C++对const关键字理解_字面量_02

我们不能直接修改const变量的值,但是可以试图通过指针这个工具,骗过编译器的语法检查,最终能否修改到const变量的值呢?

这里就要先解释一下,什么才叫真正意义上的常量, 在内存空间中,确实是有一块常量存储区专门保存常量值的,操作系统也会对该区域进行管理,不允许程序做任何修改。那怎样的变量会落入这块区域呢?只有代码中的字面量,才会成为常量存入这块区域内,那也就是说,真正意义上的常量,只能是硬编码写死的那些字面量了!

如此一来,C++编译器到底是如何将const变量变成真正意义上的常量呢?那么只有一种可能,就是转化为字面量了!到底是不是这样呢?

我们再来看一个现象:

#include <stdio.h>

int main()
{
    const int max = 10;
    int attr[max] = {0};
    return 0;
}

C与C++对const关键字理解_amp_03

g++ -o const.exe const.c

无错

可以发现C认为const变量仍然是变量,因此不能初始化数组大小,而C++ 则会将其转为字面量,因此可以初始化数组大小了。

C++ 在编译const的时候,会生成一个常量表,专门用于记录常量,在往下编译的过程中,发现使用变量的地方恰好在常量表里面有定义,会将const变量改为字面量,从而成为真正意义上的常量了!

C与C++对const关键字理解_g++_04

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   80   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   58   0   0 C++
  yZdUbUDB8h5t   2024年04月29日   59   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   44   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   58   0   0 C++
BEWlHYGDL6xD