1,C 语言中的 const:

1,const 修饰的变量是只读的,本质还是变量;

1,C 语言中的 const 使变量具有只读属性;

2,const 只在编译期有用,在运行期无用;

3,const 修饰的局部变量在栈上分配空间;

1,可以有办法改变空间中的值,此时 const 修饰的值就改变了;

4,cosnt 修饰的全局变量在只读存储区分配空间;

1,const 将具有全局生命周期的变量存储于只读存储区;

2,如果修改了 const 修饰的全局变量,程序将产生崩溃,因为我们修改了只读存储器的内容;

5,const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号左边;

1,const 不能定义真正意义上的常量;

2,过了编译器,常量特性就没有了;

2,C 语言中可以定义真正意义上的常量,通过 enum 定义的标识符才是真正意义上 的常量,也就是说 C 语言中,真正意义上的常量只有枚举;

3,C/C++ 中的 const:

1,main.cpp 文件:

 #include <stdio.h>

 int main()
{
const int c = ; // 只读变量,栈上分配空间,但不可以作为左值;
int* p = (int*)&c; printf("Begin...\n"); *p = ; printf("c = %d\n", c); // C 编译器中 c = 5; C++ 编译器中 c = 0; printf("*p = %d\n", *p); // C 编译器中 *p = 5; C++ 编译器中 *p = 5; printf("End...\n"); return ;
}

4,C++ 中的 const:

1,C++ 在 C 的基础上对const 进行了进化处理:

1,当碰见 const 声明时在符号表中放入常量;

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

3,编译过程中若发现下述情况则给对应的常量分配存储空间:

1,对 const 常量使用了 extern;

1,当前文件外部需要使用 const 常量时;

2,对 const 常量使用 & 操作符;

4,C++ 编译器虽然可能为 const 常量分配空间,但不会使用其存储空间          中的值;

1,这里是为了兼容 C 语言,之前通过 C 语言编译通过的语句,通过              C++ 也要编译通过,只不过可能程序执行的运行结果有可能 不同;

2,因为用 const 修饰变量,又用指针修改这个值,这样做是没有意义            的,所以 C++ 可以为 const 常量分配空间,但不会使用里面的值,              而是使用符号表里面的值;

2,见符号表:

1,符号表是编译器在编译过程中所产生的一张表,这张表是编译器内部的         数据结构;

5,C 和 C++ 中 const 修饰标识符的对比:

1,C 语言中的 const 变量(是变量):

1,C 语言中的 const 变量是只读变量,会分配存储空间;

2,本质依旧是变量,而编译器不准它出现在符号左边;

2,C++ 中的 const 常量(是常量):

1,可能分配存储空间(兼容 C):

1,当 const 常量为全局,并且需要在其他文件中使用;

2,当使用 & 操作符对 const 常量取地址;

2,进入符号表,真正常量;

6,C++ 中的 const 常量类似于宏定义:

1,const int c = 5; ==>(about) #define c 5; ;

C++ 中的 const 常量在与宏定义不同:

1,const 常量由编译器处理;

2,编译器对 const 常量进行类型检查和作用域检查;

3,宏定义由预处理器处理,单纯的文本替换;

1,无类型和作用域检查;

7,const 与宏编程示例:

1,main.cpp 文件:

 #include <stdio.h>

 void f()
{
#define a 3
const int b = ;
} void g()
{
printf("a = %d\n", a); // 这里 C 和 C++ 中都没有报错,因为这接进行文本替换,没有类型检查;这里等价代码为:printf("a=%d\n",3); 这里没有作用域检查;
//printf("b = %d\n", b); // const 常量会做作用域检查,报错;
} int main()
{
const int A = ;
const int B = ;
int array[A + B] = {};//C中:A + B 是两个变量相加,其结果要到运行时才知道,因此不知道 array 数组大小,报错;C++ 中:A + B 是两个常量,不报错;
int i = ; for(i=; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return ;
}

8,小结:

1,与 C 语言不通,C++ 中的 const 不是只读变量;

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

3,C++ 编译器可能会为 const 常量非配空间;

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

C++中的const分析的更多相关文章

  1. 1.C和C++区别,以及const分析

    从本章起开始从0学习C++,本章主要内容: 1)C和C++的基本区别 2)C和C++的const区别 1.C++和C区别 1.1 C++更强调语言的实用性,所有变量都可以在需要时再定义 比如: ;i& ...

  2. linux内核中链表代码分析---list.h头文件分析(一)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...

  3. 进化后的const分析

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

  4. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  5. C++中的const关键字

    http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...

  6. C++中关于const的思考

    在学习C++的过程中,经常被什么时候使用const.为什么使用const以及怎么使用const关键字这样的问题所困扰,以下是我对const的使用总结. 1.值替代 使用#define的确单缺点,第一: ...

  7. Android中AppWidget的分析与应用:AppWidgetProvider .

    from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...

  8. C与C++中的const

    同样,有下面一段代码: #include <iostream> using namespace std; int main() { ; int *j = (int *) &i; * ...

  9. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

随机推荐

  1. [洛谷P3320] SDOI2015 寻宝游戏

    问题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的 ...

  2. linux 内存

    [转]Linux 查看内存(free buffer cache) 转自:http://elf8848.iteye.com/blog/1995638 Linux下如何查内存信息,如内存总量.已使用量.可 ...

  3. CDOJ 1063 堆排序模板

    D - 秋实大哥与妹纸 Time Limit:1000MS     Memory Limit:1500KB     64bit IO Format:%lld & %llu Submit Sta ...

  4. 1.WIN10下搭建vue开发环境

    WIN10下搭建vue开发环境 详细的安装步骤如下: 一.安装node.js 说明:安装node.js的windows版本后,会自动安装好node以及包管理工具npm,我们后续的安装将依赖npm工具. ...

  5. sqli-lab(15)

    要考四级了 翻译过来就是 基于时间的单引号盲注 0X01盲注 的了解 https://www.cnblogs.com/ldhbetter/p/9201840.html 这里写的清清楚楚 A 先拆解长度 ...

  6. springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试

    上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...

  7. 第十一周java学习总结

    目录 第十一周java学习总结 学习内容 学习总结 提交代码截图 代码推送 第十一周java学习总结 学习内容 第13章 Java网络编程 主要内容 URL类 InetAdress类 套接字 UDP数 ...

  8. eigen 中四元数、欧拉角、旋转矩阵、旋转向量

    一.旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1. ...

  9. Visual Studio Code 折叠代码快捷键

    为了快速阅读不熟悉的代码, 最好可以打开一个文件能先将具体实现折叠起来的,进行一个大概的认识,vscode中有这些折叠快捷键: ctrl+shift+[是折叠 ctrl+k ctrl+0 是折叠全部 ...

  10. Microsoft.Office.Interop.Excel Find 操作

    public void SearchLoactions(string filepath, int start, int end ,string expectvalue) { if (end >= ...