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. Linux培训教程 Git在linux下的使用

       *初始化git仓库,使用gitinit命令 *添加文件到git仓库分两步: 1.使用git add filename ;可分多次使用,添加多个文件到暂存区 2.使用git commit -m “ ...

  2. Shoi2017试题泛做

    一口气做完六个省的省选(误) Day1 [Shoi2017]期末考试 枚举最大的天数,然后代价贪心地O(1)计算. #include <cstdio> #include <algor ...

  3. box-shadow inset

    安卓支持,ios不支持:box-shadow: 0px 0px 2px inset rgba(0,0,0,0.08); 安卓,ios都支持:box-shadow: inset 0px 0px 2px ...

  4. python语言优势

    与Java等语言比较起来,最大优点是语法很简洁,很多功能像octave和matlab,能够对数组或矩阵进行高效处理. 比如一个数组求和,这里只要一句话sum(a),Java等语言就需要循环.还有矩阵的 ...

  5. flask + celery实现定时任务和异步

    参考资料: Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest ...

  6. Stream之filter、distinct、skip、map、flatMap、match、find、reduce

    一.Stream之filter.distinct.skip: package com.cy.java8; import java.util.Arrays; import java.util.List; ...

  7. 用U盘完成win10系统的安装

    电脑太卡了,每次都要重装,然后每次忘记要从哪里开始动手,都要百度,仅以此篇记录下 目录 1.系统盘准备 2.从U盘启动安装 1.系统盘准备 第一步:在电脑中完成系统盘制作工具的安装,由于它是要依赖.n ...

  8. JVM监控工具之jmap、jstat、stack、jps、jstatd、jinfo、jhat、jdb

    1.jdb(The Java Debuger) jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常 ...

  9. 跨 Appdomain 对象共享

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  10. 【ABAP系列】SAP S/4 HANA的SMARTFORMS如何切换到非word编辑器

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP S/4 HANA的SMA ...