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已经不是常量了被退化成变量,这里就不再会被编译替换了,打印的都是内存中的值

最新文章

  1. Java和.NET使用DES对称加密的区别
  2. linux 查找目录或文件详解
  3. delphi检查url是否有效的方法
  4. PHP一个典型的闭包实例
  5. 日暮·第二章·烽烟传讯
  6. 2、IOS开发--iPad之仿制QQ空间 (初始化HomeViewController子控件视图)
  7. 学习练习 java 程序设计园的周长面积
  8. 使用 Bumblebee 控制 NVIDIA 双显卡
  9. wc命令--Linux统计文件行数
  10. [Locked] Flip Game I & II
  11. iOS中使用正则表达式去掉HTML中的标签元素获得纯文本的方法
  12. [转载] NoSQL简介
  13. redis基本类型和使用
  14. Go-常用库的介绍
  15. 【转】mac环境下Android 反编译
  16. SpringMVC(二六) SpringMVC配置文件中使用mvc:view-controller标签
  17. pecan API调用
  18. dojoConfig包的配置(7/26号夜)
  19. MyEclipse中设置开发项目时使用的默认JDK
  20. VirtualBox + CentOS详细安装教程

热门文章

  1. git使用的一些坑和新得(一)
  2. Java SE 9 多版本兼容 JAR 包示例
  3. 多种方法在Markdown加入上划线、中划线、下划线
  4. 演示RabbitMQ的交换类型
  5. [ARC119E] Pancakes (二维偏序,分类讨论)
  6. 「SHOI2014」概率充电器
  7. 1.2_Selenium的三生三世
  8. Docker0网络及原理探究
  9. 使用Inno Setup 制作软件安装包详细教程(与开发语言无关)
  10. 放弃 Electron,拥抱 WebView2!JavaScript 快速开发独立 EXE 程序