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. Docker 04 容器命令

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  2. Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  3. HCIA-Datacom 2.2 实验:OSPF路由协议基础实验

    前言:才发现IA也要学OSPF,忍不住吐槽一句,现在太卷了! OSPF简介: 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网 ...

  4. jQuery 判断父节点下是否有子节点

    查找父节点下是否有子节点有两个情况:(1)查找的是父元素的所有后代节点:(2)仅查找父元素的第一代子节点. <div id="app"> <div> < ...

  5. 经典01背包问题(C++)--详解

    二维数组解决01背包问题 题目: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容 ...

  6. 【java】学习路线15-接口interface、匿名内部类、接口继承

    class Learn03{    public static void main(String[] aa){        A b = new B(); //接口也可以用多态        b.me ...

  7. Qt Q_OBJECT编译问题

    编译问题 添加Q_OBJECT后需要qmake 多重继承 添加了Q_ENUM之类的宏,就需要Q_OBJECT 添加了Q_OBJECT,就需要类继承自QObject 如果有多重继承关系,QObject一 ...

  8. R数据分析:用R建立预测模型

    预测模型在各个领域都越来越火,今天的分享和之前的临床预测模型背景上有些不同,但方法思路上都是一样的,多了解各个领域的方法应用,视野才不会被局限. 今天试图再用一个实例给到大家一个统一的预测模型的做法框 ...

  9. Jenkins JNLP方式启动 Agent

    Jenkins Server配置 如果你是通过Nginx代理了jenkins,那么需要调整下Nginx的配置 map $http_upgrade $connection_upgrade { defau ...

  10. Kafka开启SASL认证 【windowe详细版】

    一.JAAS配置 Zookeeper配置JAAS zookeeper环境下新增一个配置文件,如zk_server_jass.conf,内容如下: Server { org.apache.kafka.c ...