<四>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已经不是常量了被退化成变量,这里就不再会被编译替换了,打印的都是内存中的值
<四>1:全面掌握Const的用法的更多相关文章
- C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏
const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...
- const的用法,特别是用在函数前面与后面的区别!
const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...
- ECMAScript 6 入门之let和const的用法
1.let的用法 1. //查看js的引入路径是否正确 console.log("1:",1) 2. var a=1; let b=2; console.log("a:& ...
- let 与 const 的用法
let 与 const 的用法 let 用来声明变量,并且会在当前作用域形成 代码块 conts 用来声明常量,所谓常量就是物理指针不可以更改的变量. 所谓代码块,最简单的做法就是(这个 {} 就是一 ...
- C++const关键字用法
const关键字是C++新引进的关键字,目标是用于定义常量,避免C语言中使用宏定义出现的边际问题,并且const是类型安全的,即const定义的是不可修改值的变量,它是有类型的,但是宏替换只是简单的进 ...
- Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 转 Python爬虫入门四之Urllib库的高级用法
静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...
- C++ 中 static 与 const 的用法及对比
在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...
- C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...
随机推荐
- zabbix 报表动作日志 报错”503“
- Java 可重入锁的那些事(一)
本文主要包含的内容:可重入锁(ReedtrantLock).公平锁.非公平锁.可重入性.同步队列.CAS等概念的理解 显式锁 上一篇文章提到的synchronized关键字为隐式锁,会自动获取和自动释 ...
- 【Java】学习路径62-枚举类型
public enum Role { TEACHER,STUDENT,CHEF } 使用: System.out.println(r1);//输出TEACHER System.out.println( ...
- [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
考点:JWT身份伪造.python pickle反序列化.逻辑漏洞 1.打开之后首页界面直接看到了提示信息,信息如下: 2.那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看下一 ...
- E - Road Reduction
E - Road Reduction (atcoder.jp) 题意:一棵树n个点,m条路, di表示1-i的距离,问怎么选择边可以使得d2+...dn最短. 题解: 很明显,就是直接套最短路板子,判 ...
- flutter系列之:flutter中常用的GridView layout详解
目录 简介 GridView详解 GridView的构造函数 GridView的使用 总结 简介 GridView是一个网格化的布局,如果在填充的过程中子组件超出了展示的范围的时候,那么GridVie ...
- nginx配置文件中location的三个匹配规则定义
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说. #这里是直接转发给后端应用服务器了,也可以是一个静态首页 # 第一个必选规则 location = / { #prox ...
- 使用kubeoperator安装的k8s集群配置Ingress规则有关说明
单独创建一个nginx 在 Deployment 里创建一个nginx工作负载,镜像用:nginx:alpine,并配置service为ClusterIP,然后添加Ingress规则 本地主机host ...
- ProxySQL结构
Qurey Processor 用于匹配查询规则并根据规则决定是否缓存查询或者将查询加入黑名单或者重新路由.重写查询或者镜像查询到其他hostgroup. User Auth 为底层后端数据库认证提供 ...
- ES重要配置解析
path.data和path.logs 如果您使用.zip或.tar.gz存档,则data和logs 目录是子文件夹$ES_HOME.如果这些重要文件夹保留在其默认位置,则在将Elasticsearc ...