c++学习——c与c++const修饰的变量的区别

news/2025/3/20 22:56:50/

c语言下const修饰的变量

1、c语言下const修饰的变量都有空间
2. c语言的const修饰的全局变量具有外部链接属性
在这里插入图片描述

07 const修饰的变量.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>const int a = 10;//常量区,一旦初始化,不能修改void test()
{//a = 100; //全局的const不能直接修改int *p = (int*)&a;//const int 不是  int*p = 100;//全局的const不能间接修改printf("%d\n", a);
}int main()
{const int b = 20;//b = 200;//局部的const修饰的变量不能直接修改int *p = (int *)&b;*p = 200;printf("%d\n",b);//使用别的文件的全局const修饰的变量需要声明extern const int c;printf("c=%d\n",c);system("pause");return EXIT_SUCCESS;
}

c_test.c

const int c = 20;

在这里插入图片描述
这里也就验证了****2. c语言的const修饰的全局变量具有外部链接属性

c++下const修饰的变量

这里是修改不了bb的值,是由于在编译器编译的阶段对我们写的代码进行了优化
如图所示

在这里插入图片描述
要想修改bb的值,就要加入一个关键字volatile
在这里插入图片描述
这里地址1是因为不进行优化,返回的是一个bool类型,真的就是1,假的就是0

在这里插入图片描述
c++语言的const修饰的变量有时有空间,有时没有空间(发生常量折叠,且没有对变量进行取址操作)
07 const修饰的变量.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;const int aa = 10;//c++下没有内存void test01()
{//发生了常量折叠cout << "aa=" << aa << endl;//在编译阶段,编译器:cout<<"aa="<<10<<endl;//禁止优化关键字 volatilevolatile const int bb = 20;//栈区int *p = (int *)&bb;//进行了取地址操作,所以有空间*p = 200;cout << "bb=" << bb << endl;//在编译阶段,cout << "bb=" << 20 << endl;cout << "*p=" << *p << endl;//200cout << "bb的地址为" << (int)&bb << endl;cout << "p的地址为" << (int)p << endl;
}int main()
{test01();//c++修饰的全局变量具有内部链接属性//extern const int c;//cout << "c=" << c << endl;system("pause");return EXIT_SUCCESS;
}

c++_const.cpp

//const int c = 30;  内部链接属性extern const int c = 30;//c++下加上extern就是外部链接属性

在这里插入图片描述

c++编译器不能优化的情况

1.不能优化自定义数据类型
2.如果用变量给const修饰的局部变量赋值,那么编译器就不能优化

3.编译器是在编译阶段来优化数据

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;void test01()
{int a = 10;const int b = 20;//如果用变量给const修饰二点变量赋值,那么编译器不会优化int *p = (int *)&b;*p = 100;cout << "b=" << b << endl;cout << "*p=" << *p << endl;
}void test02()
{int a = 10;const int b = a;int *p = (int *)&b;*p = 100;cout << "b=" << b << endl;cout << "*p=" << *p << endl;
}int main()
{test01();cout << "-------------------" << endl;test02();system("pause");return EXIT_SUCCESS;
}

在这里插入图片描述


http://www.ppmy.cn/news/76591.html

相关文章

3年外包裸辞,面试阿里、字节全都一面挂,哭死.....

测试员可以先在外包积累经验&#xff0c;以后去大厂就很容易&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓今年今天履历只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大…

effective c++ 30 彻底了解inline的里里外外

effective c 30 彻底了解inline的里里外外 本节主要介绍inline的条条框框。 分析 我们首先讨论inline的好处。 inline函数相当于将代码copy到调用的地方&#xff0c;可以减少函数调用的额外开销。可以替代define的宏函数却又比宏函数安全。 但是天下没有免费的午餐。 inl…

《操作系统》期末最全复习题及解析

文章目录 选择题填空题简答题程序题综合题1.银行家算法2.页面置换算法3.进程调度算法4.磁盘调度算法5.求物理/逻辑地址6.分页存储管理7.可变分区分配算法 选择题 若信号量S的初值为2&#xff0c;且有3个进程共享此信号量&#xff0c;则S的取值范围是&#xff08;B &#xff09;…

【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS

T 秒后青蛙的位置【LC1377】 给你一棵由 n 个顶点组成的无向树&#xff0c;顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下&#xff1a; 在一秒内&#xff0c;青蛙从它所在的当前顶点跳到另一个 未访问 过的顶点&#xff08;如果它们直接相连&#xff09;。青蛙无法跳回…

若依源码解析:用LoggingAspect进行日志处理

文章目录 摘要源代码LoggingAspect的作用Pointcut的作用在logback.xml配置文件中添加 <logger> 元素 摘要 本文将深入探讨若依框架中的LoggingAspect切面的作用和重要性。LoggingAspect是若依框架中用于实现日志记录功能的切面组件&#xff0c;它通过切点和切面的概念&a…

About JDKFlightRecorder--人工翻译

JFR是什么 JDK Flight Recorder是一个工具&#xff0c;用于收集有关JVM以及在JVM上运行的Java程序的诊断和分析数据。 集成到Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;使用默认设置时&#xff0c;性能影响小于1%。几乎不产生性能开销&#xff0c;因此即使在负载很…

【Python 爬虫常见的报错及其解决方法】零基础也能轻松掌握的学习路线与参考资料

Python 爬虫被广泛应用于数据采集和分析。然而&#xff0c;爬虫在运行过程中常常会遇到各种问题和错误&#xff0c;降低了爬虫效率、准确性和可靠性。因此掌握爬虫常见报错及其解决方法是非常关键的。本文将介绍 Python 爬虫常见的报错及其解决方法&#xff0c;并提供参考资料和…

【Rust日报】2023-05-22 100万并发任务各种语言需要多少内存

google推出了新的 Rust 课程 这是由 Android 团队开发的为期三天的 Rust 课程。该课程涵盖了 Rust 的全部范围&#xff0c;从基本语法到高级主题&#xff0c;如泛型和错误处理。最后一天还包括 Android 特定的内容。 该课程的目标是教授 Rust。并且假设你对 Rust 一无所知&…