C++深度解析 进化后的const分析---const常量,只读变量,符号表,宏定义(2)

C++ 深度解析教程(二)进化后的const分析、布尔类型、引用的本质分析 C++中的const 注意:(为了兼容C语言)C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。 阅读详情

C++深度解析 进化后的const分析(2)

 

 

 

C语言中的const变量

C语言中的const变量是只读变量,其本质还是变量,会在栈上分配空间。(通过枚举enum定义真正的常量)

由于const局部变量会存放在栈里,而const全局变量会存在只读存储内存上。

所以我们可以通过指针来修改const局部变量,但是修改const全局变量,会使程序崩溃

示例程序一:(用gcc编译器编译)

下面程序中c不是真正意义上的常量,而是只读变量,可以通过指针来修改const局部变量。

//*.c文件
#include <stdio.h>

int main()
{
	const int c = 0;	//得到的不是真正意义上的常量,而是只读变量
	
	int* p = (int *)&c;	//通过指针修改const变量
	*p = 5;

	printf("c = %d\n", c);
	
	printf("*p = %d\n", *p);
	
	return 0;
}

结果如下:

示例程序二:(用g++编译器编译)

//*.cpp文件
#include <stdio.h>

int main()
{
	const int c = 0;	//得到的不是真正意义上的常量,而是只读变量
	
	int* p = (int *)&c;	//通过指针修改const变量
	*p = 5;

	printf("c = %d\n", c);
	
	printf("*p = %d\n", *p);
	
	return 0;
}

结果如下:

分析示例程序一和程序二,发现了什么:

通过用指针访问const修饰的只读变量c,在C语言中是可以修改的,在C++中是不可以修改的。为什么???接下来会讲到。

 

 

 

C++中的const

在C++中,当编译器在编译的过程中,碰到const修饰的标识符,将其放到符号表中。

所以编译途中遇到使用const所修饰的标识符时,则直接从符号表中将值取出来。

C++兼容C语言,会为const所修饰标识符分配空间。

只要当const所修饰的标识符使用extern声明,或者被使用&操作符对const常量取地址,才会被分配存储空间。

PS:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。(为了兼容C语言)

示例代码:

#include <stdio.h>

int main()
{
	const int c = 0;	//const局部变量
	
	int* p = (int *)&c; //使用&操作符,会分配空间
	*p = 5;

	printf("c = %d, p=%d\n", c, *p);
	return 0;
}

结果如下:

为什么输出结果会有两个不同的值?

这是因为c是真正意义上的常量,会从符号表中取出c的值,所以c=0。并在新分配空间地址修改值为5,所以打印p=5。

总结:*p修改的只是分配出来的空间地址内容,而c还是常量。(换句话来说,为c所分配的4个字节的空间是没有作用)

 

 

 

符号表

符号表是编译器在编译过程中,所产生的一张表(编译器内部的数据结构),

所以为c分配的4字节的空间,毫无意义。只是为了兼容c语言。

//将真正意义上的常量c(标识符)放入符号表
const int c = 0;

//为标识符c分配4个字节空间,并不使用这个空间
int* p = (int *)&c;

printf("Begin...\n");

//修改的是编译器为标识符c所分配的空间
*p = 5;

//编译器会查看符号表,发现里面c,对用值是0
printf("c = %d\n", c);

printf("End...\n");

 

 

 

C++的const 和 宏定义

C++中的的const常量 类似于 宏定义

const int c = 5;   ≈≈≈≈≈≈≈≈    define c 5

C++中的const常量在与宏定义不同

const常量是由编译器处理,编译器对const常量进行类型检查和作用域检查。

define宏定义由预处理器处理,单纯的文本替换,不会进行各种检查

(预处理器是执行编译器之前运行的程序,用来删减注释,宏变量转换等)

示例程序:

#include <stdio.h>

void f()
{
	//宏是被预处理器处理的,直接进行文本替换
	#define a 3     //定义宏
	const int b = 4;//定义局部变量
}

void g()
{
	printf("a = %d\n", a);	//a=3
	//printf("b = %d\n", b);	//b的作用域f(),在f之外是不能访问b
}

int main()
{
        //A和B是真正意义上的常量
	const int A = 1;
	const int B = 2;
	//从符号表中取出数值
	int array [A + B] = {0}; //A和B是常量,从符号表取值替换,array [1 + 2]
	int i = 0;

	for(i = 0; i < (A+B); i++)
	{
		printf("array[%d] = %d\n", i, array[i]);
	}

	f();
	g();

	return 0;
}

分析上面程序:

因为执行预处理器时,会将预见到的所有a变为3,所以编译器看到的是printf("a = %d", 3);

而取消//printf("b = %d\n", b);屏蔽后,程序则会报错,是因为b的作用域只在f()函数里有效。

 

 

 

小结:

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

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

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

 

 

小熊猫C++智能代码补全:从语法分析到意图推断的工程实践 在C++开发中,语法分析和语义理解是构建高效开发工具的核心基础。通过词法分析和语法分析,工具能够解析代码结构,而语义推断则进一步理解代码意图,从而提供精准的辅助功能。这种技术组合显著提升了开发效率,尤其在代码补全和错误预防方面价值突出。在集成开发环境(IDE)中,实时分析引擎通过构建符号表和上下文感知模型,将开发者潜在的输入意图转化为智能提示。例如,当识别到流对象(如std::cout)后输入左圆括号时,分析器能推断开发者可能意图使用输出操作符,并主动展示相关重载列表。这种基于语法糖和意图预测的设计,平衡了 阅读详情

相关推荐

AI驱动的C++跨平台迁移:从语义理解到自动化代码重构

在软件工程领域,跨平台迁移是确保代码在不同硬件架构(如x86、ARM、RISC-V)上正确运行的关键任务。其核心原理在于处理因编译器差异、内存模型、数据类型和行为定义不一致导致的平台依赖问题。这项技术的价值在于显著降低迁移成本,提升代码的可移植性和长期维护性。在实际应用场景中,传统方法依赖人工审查和静态分析,但面对海量遗留代码时效率低下。如今,结合大语言模型(LLM)的智能迁移方案,通过深度代码语义分析和上下文理解,能够自动识别如未定义行为(UB)、内存序问题等隐患,并生成适配代码。例如,它能将误用于线程同

子夜轻风 152

c++基础知识12——const 生成只读变量

只读变量 c++语言中只有字面量初始化的const常量才能进入符号表中。 当出现编译时不能确定const常量的时,const常量不能进入符号表中。而只是作为一个只读变量(当然,这个变量不能作为左值使用)。如下两种即为不确定情况: 1.用其它变量初始化const常量 2.被volatile修饰的const常量 举例1. char a = 'x'; const char& b1 = a; //这里定义一个const引用b1 const int& b2 = a; //这里定义一个const引用b2

weixin_38657795的博客 648

Linux C/C++开发环境搭建:从GCC到VSCode的完整指南

在软件开发领域,构建系统与工具链是项目成功的基石。理解编译、链接和调试的基本原理,是每位C/C++开发者必须掌握的核心技能。通过合理配置开发环境,不仅能提升代码质量与开发效率,更能深入理解程序从源码到可执行文件的完整生命周期。在Linux平台上,GCC编译器和GDB调试器构成了原生工具链的核心,结合自动化构建工具如Make,可以实现高效的项目管理。而现代代码编辑器如VSCode,通过智能感知和集成调试功能,极大地优化了开发体验。本文聚焦于**Linux环境搭建**与**VSCode配置**,详细演示如何从零

weixin_34192816的博客 426

C++深度解析 经典问题解析---const和引用,只读变量和常量,引用和指针(11)【详细】

C++深度解析 经典问题解析 const和引用,只读变量和常量(11)【详细】       对于const的疑问 const常量的判别准则: 只有用字面量初始化的const常量才会进入符号表,是真正意义上的常量 使用其他变量初始化的const常量仍然是只读变量 被volatile修饰(易变的,可能发生变化的)的const常量不会进入符号表,volatile const同时修饰的标识...

Tim的嵌入式之旅 1706

临时变量作非const的引用进行参数传递引发的编译错误

临时变量作为非const的引用进行参数传递引发的编译错误。相关文章:认识左值与常引用(http://www.eeskill.com/article/id/40046)。

倍福TC3 PLC高速采集实战:如何用PLC-Recorder实现0.24ms级时间戳同步

本文详细介绍了倍福TC3 PLC与PLC-Recorder实现0.24ms级时间戳同步的工程实践方案。通过硬件拓扑设计、时间源选择优化、报文结构封装及同步验证方法,为工业自动化领域的高精度数据采集提供了可靠解决方案,特别适用于精密装配、激光切割等微秒级同步要求的场景。

weixin_29193359的博客 372

C++ const基础和const符号表机制探究

一、const基础const修饰的是常量,定义的时候必须初始化,这里只做举例说明const int a; int const b; //以上这两种写法是一样的const int *c;  //const修饰的是指针所指向的内存空间,不能被修改 int *const d;  //const修饰的是指针变量,即指针变量本身不能被修改 const int *const e;  //指针变量以及其所

凌风暨 2519

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3868

C++基础入门21 精讲

若其他学科编程语言的学习步骤是:学习,应用、上项目,那么C/C++语言的学习步骤为:学习、理解、应用、上项目,多了一步理解。就是“理解”之步骤彰显了C/C++学习难度大于其他编程语言。 本课程十分适用与学员自学

PostgreSQL和PostGIS安装、导入shp或gdb格式数据至数据库、使用QGIS测试上传PstGIS数据库操作和代码

本文详细介绍了postgresql和postgis安装步骤,并且使用postgis测试上传shp和gdb格式的矢量数据至数据库,包括步骤和代码,并使用qgis连接postgis数据查看数据库里的数据,数据依旧和本地数据一样可查看可编辑,方便后续数据底座开发和服务。

weixin_46456488的博客 1245

从原理到接法全面了解三相电

从原理到接法全面了解三相电

viixin的博客 1万+

C++-(四)C++中的经典问题分析:const,引用和指针的关系

C++中的经典问题分析(1)const (1)const 问题:const修饰的变量(标识符)什么时候是只读变量,什么时候是真正意义上的常量? (1)const + 标识符 C++编译器对const修饰的标识符的判别准则: 用数值常量(字面量)直接初始化const 变量,则数值常量(字面量)和const 变量都直接放入符号表. eg:const int a = 1;表示a此时为一个真正意义上的...

蒲公英的诗与远方 290

不用公网IP!用Ollama+Chatbox搭建家庭AI助手(内网穿透方案对比)

本文详细介绍了如何利用Ollama和Chatbox在家庭局域网中搭建本地AI助手,无需公网IP即可实现内网穿透。通过对比不同穿透方案(如Tailscale、FRP等),提供最优配置建议,帮助用户低成本部署隐私安全的家庭AI系统,适用于智能家居、儿童教育等多种场景。

weixin_26765287的博客 460

C++深度解析(2)—C/C++中的const分析

1.C语言中的const 1.1const只读变量 const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 const修饰的变量不是真的变量,它只是告诉编译器该变量不能出现在赋值符号的左边 1.2 const全局变量的分歧 在现代C语言编译器中,修改const全局变量将...

小虾米编程 568

快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代

随着这一创新工具的推出,我们正见证着Live2D角色创作进入了一个全新的阶段。它不仅极大地简化了角色设计的过程,也为广大创作者提供了一种全新的表达方式。对于那些渴望将脑海中的构思迅速转化为现实的人来说,这无疑是一大福音。现在就访问项目主页,开始探索无限可能吧!t=O83A项目主页https://human3daigc.github.io/Textoon_webpage/

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 4831

GhidraMCP:AI驱动的逆向工程革命——让LLM自主操作Ghidra进行自动化分析

(Ghidra Machine Control Protocol)应运而生,它通过将LLM与Ghidra(美国NSA开源逆向工具)结合,实现了AI驱动的自动化逆向工程流程。逆向工程是软件安全、漏洞分析和代码审计的核心环节,但传统方法依赖人工分析,耗时且易出错。未来,随着LLM技术的演进和逆向工程工具的优化,GhidraMCP有望成为安全研究人员和开发者的核心工具,推动逆向工程进入“AI辅助时代”。GhidraMCP通过LLM与Ghidra的深度整合,重新定义了逆向工程的自动化边界。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2114

第3课 进化后的const分析

C语言中的const const修改的变量是只读的,本质还是变量 const修改的局部变量在栈上分配空间 const修改的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 const修饰的变量不是真的常量,它只是告诉 编译器该变量不能出现在赋值符号的左边 C语言中的const使得变量具有只读属性 const将具有全局生命周期的变量存储于只读存储区 const不能定义...

lzg2011的博客 179

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 549

C++ const关键字深度解析:从常量定义到代码安全契约

在C++编程中,常量定义是确保数据不变性的基础技术,它通过类型安全机制防止意外修改,提升代码可靠性。其核心原理在于编译器利用常量信息进行优化和错误检查,为程序提供编译期保障。这一技术的工程价值在于构建明确的代码契约,增强接口语义和团队协作效率。在实际开发中,常量正确性广泛应用于函数参数修饰、类成员函数设计以及资源管理场景,是编写健壮C++代码的关键实践。本文聚焦const关键字,深入探讨其在指针修饰、成员函数承诺等高级用法中的常量正确性设计,帮助开发者规避常见陷阱,提升代码质量。

weixin_32325225的博客 268

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

const关键字:从C进化到C++深度剖析

(1)C语言中的const特点 const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译器有用,在运行期无用 注意:const修饰的变量不是真的变量,它只是告诉编译器该变量不能出现在赋值符号的左边  (2)思考:const 能不能定义真正的常量? 答:不能,C语言中真正定义的常量只有枚...

渲染引擎开发 205

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

进化后的const关键字

6.进化后的const关键字 本文参考自狄泰软件学院:《C++深度剖析》课程 C语言中的const const修饰的变量是只读的,本质还是变量。 const修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 a) const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。实际上...

食梦者 215

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

1.c++入门基础【由浅入深-C++】

本文介绍c++入门的相关内容。

插花弄玉的博客 2万+

基于C++的代码相似度检测系统:从词法分析到MinHash的工程实践

代码相似度检测是软件工程和计算机教育中的一项关键技术,其核心原理在于通过分析代码的结构与语义特征,量化不同代码片段之间的相似程度。该技术通过词法分析、语法树构建、控制流图提取等多维度特征融合,能够有效识别逻辑层面的相似性,而不仅仅是文本的简单匹配。其技术价值在于能够高效处理海量代码,为代码克隆检测、学术诚信审查、软件质量分析等场景提供自动化支持。在高校教学场景中,针对C++等编程语言作业的抄袭问题,结合局部敏感哈希(LSH)和MinHash算法,可以构建一个高性能、可解释的检测系统,从预处理、特征提取到相似

weixin_30813225的博客 309

崩溃分析:集成Crashlytics/Bugly(129)

/ 记录被 try-catch 捕获的非致命错误// 设置自定义键值与用户标识(便于排查问题)// 记录业务面包屑日志。

Davina_yu的博客 558

C++项目实战:Copilot与IntelliCode协同实现代码解耦

在C++开发中,代码解耦是提升软件可维护性和可扩展性的核心设计原则,它通过降低模块间的依赖关系来实现。其原理通常基于设计模式,如观察者模式,通过定义清晰的接口和抽象来分离关注点。这一技术的价值在于能构建更灵活、易于测试和演进的系统架构。在实际应用场景中,游戏事件系统、插件架构等都需要高度的解耦设计。本文聚焦于如何利用现代AI编码助手GitHub Copilot和IntelliCode,在Visual Studio环境中协同工作,高效实践这一经典工程目标。Copilot擅长根据高层意图生成代码框架,而Inte

weixin_30475039的博客 479
上一篇: C++深度解析 C到C++的升级--register,二义性,struct,类型(1)
下一篇: C++深度解析 布尔类型bool,三目运算符,引用&(3)
mainn
博客等级 码龄10年 865粉丝 447原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值