C语言中的const

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

  const修饰的局部变量在栈上分配空间(改变这个空间的值,这个变量就会改变)

  const修饰的全局变量在只读存储区分配空间

  const只在编译期游泳有用,在运行期无用

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

C语言中的const使得变量具有只读属性

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

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

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

const的C语言示例程序如下:

 #include <stdio.h>

 int main()
{
const int c = ;
int* p = (int*)&c; printf("Begin...\n"); *p = ; printf("c = %d\n", c); printf("End...\n"); return ;
}

执行结果如下:

可以看待const变量c的值被改变了。

我们将上面的程序写到const1.cpp文件中用g++编译器进行编译,执行结果如下:

添加一句打印,我们观察*p的值:

 #include <stdio.h>

 int main()
{
const int c = ;
int* p = (int*)&c; printf("Begin...\n"); *p = ; printf("*p = %d\n", *p);
printf("c = %d\n", c); printf("End...\n"); return ;
}

执行结果如下:

可以看到*p的值是5,这说明内存空间中的值确实改变了,但是c的值没有改变。

C++中的const:

  C++在C语言的基础上对const进行了优化处理

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

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

    编译过程中若发现下述情况则给对应的常量分配存储空间(兼容C语言,保证C语言程序能编译过去)

      对const常量使用了extern    

      对const常量使用了&操作符

注意:

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

符号表的示意图如下:

对比:

C++中的const与宏定义:

宏定义与const的示例程序如下:

 #include <stdio.h>

 void f()
{
#define a 3
const int b = ;
} void g()
{
printf("a = %d\n", a);
//printf("b = %d\n", b);
} int main()
{
const int A = ;
const int B = ;
int array[A + B] = {};
int i = ; for(i=; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return ;
}

gcc的编译结果如下:

C语言中const修饰的是只读变量,也就是说19行的程序中数组的大小是由变量定义的,所以编译会出错。

用C++编译器编译上述的程序,结果如下:

对C++编译器来说,const修饰的变量会进入符号表,是常量,第19行会直接去符号表中取值,认为是常量所以不会报错。

上面的程序中f函数中定义的宏在g函数中可以直接使用,因为宏是由预处理器处理的,不存在作用域问题。编译器根本不知道宏是什么。

而如果使用const常量代替宏定义,则编译器就会进行作用域检查了。

小结:

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

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

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

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

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

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

    1.  C语言中的const (1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量.所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. (2)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. Bootstrap table后端分页(ssm版)

    说明bootstrap table可以前端分页,也可以后端sql用limit分页.这里讲的是后端分页,即实用limit.性能较好,一般均用这种源码下载地址:https://git.oschina.ne ...

  2. ZW网络团队及资源简介

    ZW网络团队及资源简介 ZW网络推广团队,是国内首个教父级网络营销团队,自1997年以来,先后参与操盘多个重大互联网项目,服务过超过150家国际500强客户,是微软公司首家官方认证的网络公关服务商,新 ...

  3. hdu5021 树状数组+二分

    这 题 说 的 是 给 了 一 个 K—NN    每次查询离loc 最近的k个数 然后将这k个数的权值加起来除以k 赋值给 loc 这个位置上的 权值  我说说 我的做法 假如 查询的是loc 这个 ...

  4. Python: 大型数组运算

    需要在大数据集(比如数组或网格) 上面执行计算,涉及到数组的重量级运算操作,可以使用NumPy 库. 下面是一个简单的小例子,展示标准列表对象和NumPy 数组对象之间的差别 >>> ...

  5. 网关服务Spring Cloud Gateway(一)

    Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...

  6. Cooperation.GTST团队第三周项目总结

    项目进展 这周我们仍然在学习使用博客园的相关接口,页面的一个基本模块已经搭建出来了,但是页面整体效果还没有完全做出来.另外,我们在使用其他的APP时留意到许多APP都使用上拉加载和下拉刷新的效果,所以 ...

  7. C++网络通信字节序问题

    htonl(), ntohl(), htons(), ntohs() 函数 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), n ...

  8. [原][osgearth]osgearthElvation中的一帧

    create tile key contains 获取tile上的临界值 这里先获取层数的切份(下图) 然后使用xmin,xmax,ymin,ymax获取tile的四个点 再通过geoextent获取 ...

  9. kali debian linux 的samba 共享设置

    1) 首先,默认的源http.kali.org 会自动帮你找镜像,问题是他找到了 mirrors.neusoft.edu.cn , 这个源速度虽然快,却是有问题的. 安装不了cifs-utils 2) ...

  10. Android Studio 中实现高德定位并获取相应信息

    Android开发项目时常常会遇到定位这个功能,所以写了这篇博客,今天主要讲的高德地图的定位并获取相应信息. 首先导入高德的jar包 选中jar包右键点击  Add As Library, 在buil ...