<七>1:全面掌握Const的用法
const怎么理解?
const修饰的变量不能够在作为左值!!初始化完成后,值不能被修改!!
C 和C++中const 的区别?
在C程序中
test.c
const int a; 只定义,不做初始化(C中允许),如果不做初始化,那么后面就不能再赋值了.
在C语言中const修饰的量,可以不用初始化,这个不叫常量,叫做常变量,本质还是变量,只是不能作为左值被修改值了
例如1: 在.c的程序中
const int a=100;
int array[a]={}; 是不可以的, 因为a不是常量,他还是个变量
例如2: 在.c的程序中
const int a=100;
int *p=(int *)&a;
*p=300;
printf("%d %d %d \n",a ,*p,*(&a));//结果都为300
a只是在语法上保证了不能作为左值被修改,但是他内存中的值是可以被修改的,例如通过指针.
在C++程序中
test02.cpp
const int b; 编译报错,在C++中const修改的就叫常量,定义的时候必须被初始化,由于是常量了
所以可以用来定义数组的长度,如下代码
例如3: C++代码
const int b=100;
int array[b]={};
例如4: C++代码
const int b=100;
int *p =(int *)(&b);
*p = 300;
print("%d %d %d",b,*p,*(&b));//打印结果是 100,300,100
这个结果为什么会和在C语言环境下的结果不一样?
是因为C和C++编译器对待const的编译处理方式不一样,在C语言中,const修饰的仍然被当做变量来编译生成指令的
C++中.出现的被const修饰的常量名,在编译的过程中都会被常量的初始化给替换掉的
所以上面 print("%d %d %d",b,*p,*(&b));
b 被替换成100, *(&b)会被编译器优化掉 也是100
同时b在内存中的值被修改了,改成了300
注意
在C++中const 修饰同时被初始化的值是一个立即数,那么他就是个常量,如下
const int a = 100;
int *p = (int *)(&a);
*p=300;
print("%d %d %d",a,*p,*(&a));//打印结果是 100,300,100
编译过程中 a都会被替换成被初始化的立即数100
但是如果用一个变量来初始化const修饰的量,就不再是常量了,会退化成常变量,本质上变成变量了 如下
int b=1;
const int a=b;
int arr[a]={};//这一行编译报错,因为a已经不再是常量了
int *p = (int *)(&a);
*p=300;
print("%d %d %d",a,*p,*(&a));//打印结果是 300,300,300,由于a已经不是常量了被退化成变量,这里就不再会被编译替换了,打印的都是内存中的值
相关文章
- 河道水面漂浮物垃圾识别监测系统
- Linux下简单计算md5,base64,sha1,sha2
- 记一次黑苹果的安装
- KMP算法笔记II ----- 学会计算next数组
- 2018面试总结
- Python 计算文件中总行数
- Python 计算与伪造TCP序列号
- Python 使用PyQt生成图形界面
- 可信计算 RESTFul API
- 可信计算压力测试
- 过年必备!亲戚计算器「GitHub 热点速览 v.23.02」
- 揭开周获 18k star 开源项目的神秘面纱「GitHub 热点速览 v.22.28」
- GitHub 桌面版 v3.0 新特性「GitHub 热点速览」
- 高手过招不用鼠标,一款超好用的跨平台命令行界面库
- 感恩陪伴 HelloGitHub 定制的红包封面
- 在 GitHub 复活 80 年代的游戏代码,它们出自第一本售出百万册的计算机书籍
- Tomcat 应用中并行流带来的类加载问题
- 函数式编程杂谈
- Kafka 原理和实战
- 基于 Lerna 管理 packages 的 Monorepo 项目最佳实践