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:全面掌握Const的用法的更多相关文章

  1. C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏

    const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...

  2. const的用法,特别是用在函数前面与后面的区别!

    const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...

  3. ECMAScript 6 入门之let和const的用法

    1.let的用法 1. //查看js的引入路径是否正确 console.log("1:",1) 2. var a=1; let b=2; console.log("a:& ...

  4. let 与 const 的用法

    let 与 const 的用法 let 用来声明变量,并且会在当前作用域形成 代码块 conts 用来声明常量,所谓常量就是物理指针不可以更改的变量. 所谓代码块,最简单的做法就是(这个 {} 就是一 ...

  5. C++const关键字用法

    const关键字是C++新引进的关键字,目标是用于定义常量,避免C语言中使用宏定义出现的边际问题,并且const是类型安全的,即const定义的是不可修改值的变量,它是有类型的,但是宏替换只是简单的进 ...

  6. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  7. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  8. C++ 中 static 与 const 的用法及对比

    在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...

  9. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

随机推荐

  1. P4767 [IOI2000]邮局 - 平行四边形不等式优化DP

    There is a straight highway with villages alongside the highway. The highway is represented as an in ...

  2. XYX错误集

    (频数递减) # 数据范围:没开Long Long (*inf^2) # while 打成了 if ,if 打成了 while(*inf^2) # 换根DP:两个dfs调用错误 (*inf) # ZK ...

  3. java方法---递归

    java方法递归 1.什么是递归 就是自己调用自己: 2.递归结构的两个部分 递归头:什么时候不调用自身方法.如果仅有头,将陷入死循环.递归体:什么时候需要调用自身方法.

  4. PHP代码审计——文件操作漏洞

    梦想CMS(lmxcms)任意文件删除 1. 漏洞详情--CNVD-2020-59469   2. 漏洞描述称后台Ba***.cl***.php文件存在任意文件删除,查看cms源码,只有BackdbA ...

  5. KingbaseES V8R6C5集群部署启动securecmdd服务配置案例

    案例说明: 对于KingbaseES V8R6C5版本在部集群时,需要建立kingbase.root用户在节点间的ssh互信,如果在生产环境禁用root用户ssh登录,则通过ssh部署会失败:在图形化 ...

  6. KingbaseES R6 集群主机锁冲突导致的主备切换案例

    ​ 案例说明: 主库在业务高峰期间,客户执行建表等DDL操作,主库产生"AccessExclusiveLock "锁,导致大量的事务产生锁冲突,大量的会话堆积,客户端session ...

  7. KingbaseFlySync delete语句WHERE条件缺失的解析出错问题处理思路

    KingbaseFlySync delete语句WHERE条件缺失的解析出错问题处理思路 关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java ...

  8. Hive的基本知识与操作

    Hive的基本知识与操作 目录 Hive的基本知识与操作 Hive的基本概念 为什么使用Hive? Hive的特点: Hive的优缺点: Hive应用场景 Hive架构 Client Metastor ...

  9. TextView 中文本内容换行

    TextView 中文本内容换行 首先如图所示,我的第一栏围城的书名和书的介绍是在同一行 但是我想让书名和书的介绍分开个站一行 这时我只要在我的数组文本中的文本用 "\n" 就可以 ...

  10. ProxySQL 定时调度

    转载自:https://www.jianshu.com/p/410ff5897c27 Scheduler是 v1.2.0 引入的特性. ProxySQL的Scheduler是一个类似于定时任务系统(c ...