<四>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 ...
随机推荐
- RAID磁盘阵列技术
RAID磁盘阵列技术 1.RAID概述 RAID(Redundant Array of Independent Disk),从字面意思讲的是基于独立磁盘的具有冗余的磁盘阵列,其核心思想是将多块独立磁盘 ...
- 开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
在我们开发开发H5程序或者小程序的时候,有时候需要基于内置浏览器或者微信开发者工具进行测试,这个时候可以采用默认的localhost进行访问后端接口,一般来说没什么问题,如果我们需要通过USB基座方式 ...
- 什么?WPF 不支持 SVG ?
什么?WPF 不支持 SVG ? 控件名:SharpVectors 作者:Elinam LLC (Japan) 项目地址: https://github.com/ElinamLLC/SharpVect ...
- OpenJ_Bailian - 3424 Candies (差分约束)
题面 During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teache ...
- 【java】学习路径39-Buffered缓冲输出流
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; pu ...
- 基于Vue3实现一个前端埋点上报插件并打包发布到npm
前端埋点对于那些营销活动的项目是必须的,它可以反应出用户的喜好与习惯,从而让项目的运营者们能够调整策略优化流程提高用户体验从而获取更多的$.这篇文章将实现一个Vue3版本的埋点上报插件,主要功能有 通 ...
- python筛选excel内容并生成exe文件
最近疫情原因,班级每天都要筛选未打卡人员,每次都手动操作太麻烦了.遂写下如下的程序,并且生成了exe可执行文件. 1. 主程序 import openpyxl import pyperclip # 1 ...
- MQ系列5:RocketMQ消息的发送模式
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 在之前的篇章中,我们学习了RocketMQ的原理, ...
- JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率
大家好,又见面了. 在JAVA做前后端分离的项目开发的时候,服务端需要提供接口文档供周边人员做接口的对接指导.越来越多的项目都在尝试使用一些基于代码自动生成接口文档的工具来替代由开发人员手动编写接口文 ...
- 纯CSS实现“流星赶月”,祝大家中秋节快乐
明天就是中秋节了,就想着用CSS画一个月亮送给园友们吧.但是就画一个月亮也太简单了些,于是便加了一些星星点缀以及流星坠落的效果.这篇文章就用纯CSS为大家实现一个"流星赶月"的效果 ...