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. LuoguU72177 火星人plus (逆康拓展开)

    没开long long见祖宗... BIT先求逆序对来造表存展开关系,线段树维护01进制 #include <iostream> #include <cstdio> #incl ...

  2. Luogu2543[AHOI2004]奇怪的字符串 (动态规划 LCS)

    04年的省选这么water吗,开个滚动数组算了 #include <iostream> #include <cstdio> #include <cstring> # ...

  3. Vue3 + Socket.io + Knex + TypeScript 实现可以私聊的聊天室

    前言 下文只在介绍实现的核心代码,没有涉及到具体的实现细节,如果感兴趣可以往下看,在文章最后贴上了仓库地址.项目采用前后端模式,前端使用 Vite + Vue3 + TS:后端使用 Knex + Ex ...

  4. Excel 数学函数(三):RAND 和 RANDBETWEEN

    Excel 主要有 RAND 和 RANDBETWEEN 这两个函数生成随机数.RAND 默认生成 0~1 的随机数:RANDBETWEEN 有两个参数:bottom 和 top,bottom 代表函 ...

  5. Dart 导包时类名冲突

    import 'package:qingyuo_mobile/pages/slices/home_page/tech_slice.dart'; import 'package:qingyuo_mobi ...

  6. 【java】学习路径37-练习:任意文件的复制

    使用字节完成复制 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException ...

  7. ubuntu20.4 sgx环境配置

    一.driver安装 1.在该下载地址将3个.bin文件下载下来,下载地址:https://download.01.org/intel-sgx/latest/linux-latest/distro/u ...

  8. 【PMP学习笔记】第5章 项目范围管理

    一.规范管理的内涵 项目范围管理:包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程. 项目范围:为交付具有规定特性与功能的产品.服务或成果而必须完成的工作. 预测型:开始时定义可交付成果, ...

  9. Dubbo本地调试

    dubbo 启动标志 Dubbo service server started <dubbo:reference id="transferTimingUploadHisRPCServi ...

  10. ORM增删改查并发性能测试2

    前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...