无意间看到一题目 是关于const变量的。代如下:

问题是:pCInt = &LENGTH。然而后面的输出是1 2。为什么???

一步一步分析,const int *pCInt = & LENGTH;pCInt 为指向LENGTH地址的值,且为常量。

(int) *pCInt = 2; 实际上等同const_cast<int>(*pCInt) = 2;

去掉变量的常量属性再赋值。也就是改变了 pCInt 指向的地址的值为2。

即然值为2,那么LENGTH中内存的值也为2,为什么会输出1呢?是不是编译器做了什么处理?(我当时给出的回答就是编译器做出了处理,具体是什么不清楚)

后来仔细想了下,可能是符号替换,不知道对不。

下面用汇编代码来验证我们的想法。

(为了看得清楚,把cout改成printf了)

从printf("%d/n",LENGTH);

00401056  push        1

可以看出,编译器是做的符号替换,就是在编译的时候遇到LENGHT直接替换为1。

printf("%d/n",*pCInt);

00401065  mov         eax,dword ptr [pCInt]

00401068  mov         ecx,dword ptr [eax]

遇到*pCInt是直接从内存中去取值。

总结如下:

1.变量本身的类型最好不要去改变,除非必要。

2.要明确cosnt的意义,什么时候该用,什么时候不该用,这是基本功。

3.理解符号替换,就相当于宏定义。

关于const变量的一点理解相关推荐

  1. C语言 const、volatile、const volatile限定符理解

      在C语言经常会用到变量类型限定符const和volatile,但是const和 volatile也可以一起使用.下面就一次分析一下这三种情况的使用方法. 1.const   从字面意思理解,意思就 ...

  2. var和let和const_用故事讲解JavaScript的var,let和const变量

    var和let和const by Prarthana S. Sannamani 通过Prarthana S.Sannamani 用故事讲解JavaScript的var,let和const变量 (Jav ...

  3. 编译器在处理const变量跟一般变量时的区别

    const变量,也就是常量,当某个变量加上const属性的时候,表明这个变量不可修改. const变量是不可写的,那么我们对于const变量的处理只剩下读操作了. 当我们读一般的变量的时候,会先获取该 ...

  4. 2.深入一点理解C源程序的编译过程

    2.深入一点理解C源程序的编译过程 本文章的大多数灵感及知识来源于南京大学的计算机系统基础教材,如果希望更加深入地对相关知识做进一步了解,可以移步上述相关资源.在网上可以轻易获得上述资源,mooc也有 ...

  5. linux useradd bash,对于bash:useradd:command not found错误的一点理解

    对于bash:useradd:command not found错误的一点理解 问题: 前两天做实验,在命令行中添加用户时显示bash:useradd:command not found的错误,在网上 ...

  6. oracle中sga可以共享么,关于共享段与SGA的一点理解

    关于共享段与SGA的一点理解 上一周买了两本书,google了不少文档资料,看了看部分linux源代码终于有了以下一些理解.不知对不对 一 各类地址概念 1 逻辑地址:我们一般在用汇编语言写程序时可能 ...

  7. C语言 const变量能不能修改?

    笔者在跟同事讨论变量存放的分区问题时,讨论到了const标识符所标记的变量能不能修改这个问题. 按直观理解,const关键字标识的变量,意味不能修改的变量,引申理解,猜测其可能存放在.rodata分区 ...

  8. mixin机制 vue_谈谈vue中mixin的一点理解

    谈谈vue中mixin的一点理解 vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情 ...

  9. 定义const变量是不可以赋值_定义好 const 变量

    我们 a 组组长发了一张图过来,说是为什么之前把 dateModeTransform.js 处理日期的改了,让我改回来,说是要用到 年月日时分秒,还有之前的写法也有很多不妥的地方就是传递的参数太多了, ...

最新文章

  1. 设计模式复习-装饰模式
  2. 怎么用matlab处理数据,如何用Matlab处理.wfm格式的数据
  3. Eclipse连接到My sql数据库之前操作
  4. uestc 方老师的分身 III 拓扑排序
  5. python 列表为空_如果列表为空,则Python返回False
  6. 《软件开发这点事儿》作者邵志东老师视频发布
  7. 什么是servlet ,servlet的作用
  8. 液晶拼接处理器_你想了解的LCE拼接屏幕都在这里
  9. cocos creator后台切入切出
  10. 服务器网页多重定向,浏览器提示该网页包含太多服务器重定向是什么意思 - 卡饭网...
  11. 几种不同格式的json解析
  12. hive client 登录报权限不足问题/tmp/hive on HDFS should be writable. Current permissions are: rwx------
  13. 利用bilibili增强脚本下载B站视频+更多强大功能
  14. 【Hive】解析复杂json格式字段
  15. win7右键计算机死机,win7系统右键死机的解决方法
  16. Linux IPTABLES 防火墙专题讲座 - 上篇-龙小威-专题视频课程
  17. EXPLAIN 使用
  18. Google Voice的简单介绍。(一点都不简单)
  19. 文件用手机拍照片打印时,打印出来总是有黑阴影,如何去掉黑色阴影打印清晰的图片
  20. 决策树算法梳理以及python实现

热门文章

  1. 电阻(4)之上/下拉电阻
  2. 根据接口入参不同返回不同对象集合的方法
  3. 收藏一下mybatis全局参数配置
  4. (002)每日SQL学习:删除名称重复的数据
  5. ie 9 渐变背景色兼容问题
  6. FFmpegh.264解码
  7. 深入分析Flex [Bindable] 【转】
  8. 汇编基础知识之输入输出
  9. Python (五) 高级特性
  10. 【Linux】一步一步学Linux——telinit命令(144)