1.  C语言中的const

(1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量。所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。

(2)const修饰的局部变量栈上分配空间全局变量只读存储区分配空间

(3)const只在编译期有用,在运行期无用

【编程实验】C/C++中的const

#include <stdio.h>

int main()
{
const int c = ; //C语言中会为变量c分配内存
int* p = (int*)&c; //C++中遇到&才为c分配内存 printf("Begin...\n"); *p = ; //内存中的值己被改为5. printf("c = %d\n", c);//C语言会输出内存中的5.
//C++中会从符号表(而不是内存)中取值
//所以为0. printf("End...\n");
return ;
}

2. C++中的const

(1)C++在C的基础上对const进行了优先处理,当碰见const声明时在符号表中放入常量。

(2)编译过程中若发现使用常量,则直接以符号表中的值替换

(3)编译过程中若发现对const常量使用了extern&操作符,则会给对应的常量分配存储空间。注意,C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

3. 对比C/C++中的const

C语言

C++

本质

只读变量

常量

分配内存

会分配

当使用&操作符对const常量取地址时分配

当const常量为全局,并且需要在其它文件中使用时会分配内存

4. C++中的const与宏的区别

C++中的const

定义

const int c = 5;

#define c 5

处理方式

编译器处理,编译器会进行类型检查作用域检查

预处理器处理,只是简单的文本替换

【编程实验】const与宏

#include <stdio.h>

void f()
{
//宏由预编译处理,其后面的宏起作用
#define a 3 const int b = ;//作用域仅限于f函数
} void g()
{
printf("a = %d\n", a); //合法,只要是宏定义之后都可以使用 //printf("b = %d\n", b); //非法b的作用域仅限于f函数
} int main()
{
const int A = ;
const int B = ;
int array[A + B] = {};//C++中合法,因为它认为A、B都是常量。
//而C语言的const本质还是变量,数组大小只能是常量 int i = ; for(i=;i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return ;
}

5. 小结

(1)与C语言不同,C++中的const不是只读变量

(2)C++中的const是一个真正意义上的常量

(3)C++编译器可能会为const常量分配空间

(4)C++完全兼容C语言中的const常量的语法特性

第3课 进化后的 const分析的更多相关文章

  1. 第3课 进化后的const分析

    C语言中的const const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间(改变这个空间的值,这个变量就会改变) const修饰的全局变量在只读存储区分配空间 const ...

  2. 进化后的const分析

    C语言中的const const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 注意:c ...

  3. C++解析(2):进化后的 const 分析

    0.目录 1.C语言中的const 2.C++中的const 3.对比 3.1 C语言与C++中的const 3.2 C++中的const与宏定义 4.小结 1.C语言中的const const修饰的 ...

  4. 第3课.进化后的const

    1.c语言中 const修饰的变量是只读的,本质上还是变量 const修饰的局部变量在栈上分配空间(因为在栈上分配空间,所以我们可以通过改变这个空间的值.间接去改变这个变量.) const修饰的全局变 ...

  5. C++ 成员函数前和函数后加const修饰符区别

    博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include< ...

  6. [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本

    [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...

  7. [Reprint]C++函数前和函数后加const修饰符区别

    c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...

  8. C++函数前和函数后加const修饰符区别

    class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...

  9. C++类的成员函数的形参列表后面的const

    看到(C++ Primer)类的成员函数这里,突然对成员函数形参列表后面的const感到迷惑. 因为书中开始说是修饰隐含形参this的,然后又说是声明该函数是只读的. 大为不解! 翻资料.找人讨论.. ...

随机推荐

  1. python3.6 ubuntu

    apt-get install python3.6-dev 安装 pip install mysqlclient 必备

  2. grafana查询中的变量templating

    有时我们在管理成百上千台机器的时候,配置grafana无疑是明智的,因为你不需要一个一个的把每个机器的图形都配置一遍,利用templating就可以瞬间实现n台机器的状态显示了. templating ...

  3. ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed

    1.  问题描述 最近使用ABP .Net Core框架做一个微信开发,同时采用了一个微信开发框架集成到ABP,在微信用户关注的推送事件里调用了一个async 方法,由于没有返回值,也没做任何处理,本 ...

  4. 用js取1-100的随机数

    function sum (m,n){ var num = Math.floor(Math.random()*(m - n) + n); alert(num) } sum(1,100): 万能 公式, ...

  5. WinRAR的自解压模式 - imsoft.cnblogs

    一个 SFX (SelF-eXtracting)自解压文件是压缩文件的一种,它结合了可执行文件模块,一种用以运行从压缩文件解压文件的模块.这样的压缩文件不需要外部程序来解压自解压文件的内容,它自己便可 ...

  6. JSON-java

    import net.sf.json.JSONArray; import net.sf.json.JSONObject; JSONObject jsonObject1 = new JSONObject ...

  7. Unity 3D游戏-贪吃蛇类游戏源码:重要方法和功能的实现

    贪吃蛇类游戏源码 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 头部移动方式 2 生成 Shit 道具 ...

  8. php7 安装swoole4.0.4

    下载 https://codeload.github.com/swoole/swoole-src/tar.gz/swoole-4.0.4 tar zxvf swoole-4.0.4 mv swoole ...

  9. 万年历(hao123)代码

    网上有很多类似的代码,比如网站:hao123,IP138.日梭万年历网络版 等等,不过日梭万年历相对比较详细,也可以看看另外一篇文章的介绍: 日梭万年历网络版:http://www.cnblogs.c ...

  10. MySQL只有.frm文件恢复表结构

    http://www.ttlsa.com/mysql/mysql-utilities-mysqlfrm/ 以诊断模式读取目录中的所有的FRM文件: D:\Program Files (x86)\Eas ...