Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C和C++中的const修饰符的全面对比

C和C++中的const修饰符的全面对比

作者头像
lexingsen
发布于 2022-02-24 07:55:26
发布于 2022-02-24 07:55:26
27400
代码可运行
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客
运行总次数:0
代码可运行

C和C++中的const

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main.c
/*C中的const
const修饰的变量可以不初始化
const修饰的量叫常变量,不是常量
绝对的常量就是一个立即数,可以作为数组的下标
const修饰的常变量和普通变量的唯一区别是:常变量定义以后不能作为左值存在
常变量和普通变量的编译方式一模一样
同一工程下,可以引用其他文件中定义的被const修饰的全局变量
a.c  const int gdata = 10;//生成的符号是global属性的
b.c  extern const int gdata;

*/

int main(){
    const int a;//可以不初始化,如果不初始化,以后没有办法给其一个合适的值
    const int b = 10;
    //b = 20;//错误,不能进行赋值,常变量不能作为左值存在
    //int array[a] = {0};//不能做为数组的下标

    int *p = (int*)&b;
    *p = 30;
    printf("*p = %d \n",*p);
    printf("b = %d \n",b);
    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main.cpp
/*
c++中的const的必须初始化
const修饰的量是真正的常量,可以作为数组的下标
(c++中const的编译规则 所有使用常量名字的地方全部替换为常量的初始值)
*/
int main(){
    const int a = 10;
    int arr[a] = {0};
    int *p = (int*)&a;//这里引用的是a的地址,不是a的值
    cout<<"p = "<<p<<endl;
    cout<<"&a = "<<&a<<endl;
    *p = 30;
    cout<<"a = "<<a<<endl;
    cout<<"*p = "<<*p<<endl;
    return 0;
}

什么时候const修饰的常量会退化为常变量? 当const所修饰的量引用一个编译阶段不明确的值的时候,const会退化为常变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test.cpp
int main(){
    int a = 20;//是指令,执行的时候才能确定下来
    const int b = a;
    int arr[b] = {0};
    return 0;
}

从汇编的角度看const

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
int main(){
    int a = 10;//mov  dword ptr[ebp-4],0Ah
    const int b = a;//退化成常变量
    //eax,dword ptr[ebp-4]
    //mov dword ptr[ebp-8],eax
    cout<<b<<endl;

    const int c = 10;//真正的常量
    //mov dword ptr[ebp-0Ch],0Ah
    cout<<c<<endl;
}

c++中const生成的符号 在c++中,定义的被const修饰的全局变量所生成的符号是local。若在其他*.cpp文件引用该全局变量,则会出现链接错误。因为链接器只处理属性为global的符号,不处理属性为local的符号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a.cpp
const int gdata = 20;

为了使得在 *.cpp文件定义的被const所修饰的全局变量可以在其他 *.cpp文件所能引用,则需在定义就加extern关键字,使其生成属性为global的符号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a.cpp
extern const int gdata = 20;

由图可以看到,此时被const修饰的全局变量gdata所生成的符号其属性为global。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C和C++中经const修饰的常量、常变量和普通变量的区别
(1)常量:在c++中,const int a = 10是一个真真正正的常量。 (2)常变量:退化为常变量的情况,初始化为一个不明确的值。 (3)常变量和普通变量生成的符号的作用域不一样。
lexingsen
2022/02/24
5240
C和C++中经const修饰的常量、常变量和普通变量的区别
c和c++的区别 (一)函数默认值、内联函数、函数的重载和c/c++之间的相互调用
一.函数默认值 c++支持给函数的形式参数进行默认初始化,其规则为从右向左依此初始化。
lexingsen
2022/02/24
7340
c和c++的区别 (一)函数默认值、内联函数、函数的重载和c/c++之间的相互调用
c和c++的区别(二)const和引用、一级指针、二级指针的结合
在C++中,当const关键字修饰常量时,const所在的位置,会不会出现问题。主要是担心代码会修改被const修饰的常量值,如果有这样的风险,编译器不会通过代码的编译的。
lexingsen
2022/02/24
4820
c和c++的区别(二)const和引用、一级指针、二级指针的结合
【C++】42道面试经典问题总结
C和C++的内存分布没有区别,usr space (reserve、.text、.rodata、.bss、heap stack 命令行参数和环境变量)+kernal space(ZONE_DMA 、ZONE_NORAMAL、ZONE_HIGHMEM)
洁洁
2024/09/11
1500
引用的条件及从汇编角度理解引用
(1)定义引用时必须进行初始化。 (2)初始化的值要能取地址,不能用一个立即数进行初始化。
lexingsen
2022/02/24
5560
引用的条件及从汇编角度理解引用
C/C++ const
const是C语言的关键字,经C++扩充,功能变得强大,用法复杂。const用于定义一个常变量(只读变量)。当const与指针、引用、函数等结合起来使用时,情况会变得更加复杂。下面将从七个方面总结const的用法。
恋喵大鲤鱼
2018/08/03
9000
话说const修饰符与static修饰符
这也是面试和笔试中经常会考到的问题,特别是static我面试了四家就考了两家,但是一般会放在前两题,属于特别基础的题目了。
用户2617681
2019/08/08
9480
C++类的构造函数与析构函数
C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。
Masimaro
2018/08/31
1.7K0
【C++】面试基础重点知识
任何的编程语言=》 都会产生两种东西 1.指令 2.数据 当一个程序运行时,Linux操作系统会给当前进程分配一个2的32次方的一块虚拟地址空间 也就是4个G。(×86 32位Linux系统下)
洁洁
2024/09/12
1170
const的那些事
在我们使用c/c++的时候,或者在面试的时候,会被问道与const相关的问题,比如const修饰放在指针的哪个位置,const修饰的引用传递与值传递等等,这些究竟是什么个情况,本节就是专门来解决const的疑难杂症,干掉const,offer拿到手软!
公众号guangcity
2019/09/20
6570
1.C和C++区别,以及const分析(底层const/顶层const)
int f() int f(void)表示都一样,没有参数,返回值为int型的函数
诺谦
2019/05/24
9060
滴水逆向初级-C语言(二)
1、声明变量 变量类型变量名; 变量类型用来说明宽度是多大 int 4个字节 short 2个字节 char 1个字节
zhang_derek
2021/04/13
1.3K0
C/C++ volatile
volatile是“易变的”、“不稳定”的意思。volatile是C的一个较为少用的关键字,它用来解决变量在“共享”环境下容易出现读取错误的问题。
恋喵大鲤鱼
2018/08/03
1.9K0
面经:C++面试精品问答题总结(一)
这里收集市面上所有的关于算法和开发岗最容易遇到的关于C++方面的问题,问题信息来自互联网以及牛客网的C++面试题目汇总。答题总结的顺序大体是按照问题出现的频率进行排序的,也有自己被面试问到的问题,越在前面的问题再面试中越容易被问到,作为笔记。当然,这些C++概念适合所有人,并非是准备面试或者正在面试的童鞋,如果想对C++多了解一些或者想避免一些C++常见错误的,可以建议看一看本系列文章的内容。
老潘
2023/10/19
5770
地址、指针与引用
计算机本身是不认识程序中给的变量名,不管我们以何种方式给变量命名,最终都会转化为相应的地址,编译器会生成一些符号常量并且与对应的地址相关联,以达到访问变量的目的。  
Masimaro
2018/08/31
7260
C++中引用的本质
引用是C++引入的重要机制,它使原来在C中必须用指针实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢?
恋喵大鲤鱼
2018/08/03
7630
C++中引用的本质
构造管“生”对象?析构管“埋”对象?C++中构造析构还没整明白?
[导读] C++语言有时候也拿来写写应用代码,可是居然发现连构造、析构都还没弄明白,把这糟心的概念整理分享一下。
C语言与CPP编程
2020/12/02
5900
构造管“生”对象?析构管“埋”对象?C++中构造析构还没整明白?
C++初阶-入门基础语法
2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
用户9645905
2022/11/30
7330
C++初阶-入门基础语法
ndk C++ 编译器的函数名修饰规则
最近ndk debug好痛苦,堆栈里都是C++修饰过的名字,每次转化成实际的类和方法都要脑子里转一下,虽说c++filt可以转换,但是转换后可能更蒙蔽。。。这里贴出两篇文章供参考。
望天
2019/08/29
2.1K0
C++中Const常量机制分析
const为C/C++常用的修饰符,表示该变量是一个常量,不可被修改等含义。那么在实际使用中会存在如下疑问:
洛杉矶
2018/06/08
2.5K0
相关推荐
C和C++中经const修饰的常量、常变量和普通变量的区别
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验