第3课 进化后的const分析
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分析的更多相关文章
- 第3课 进化后的 const分析
1. C语言中的const (1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量.所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. (2)const修饰的局部 ...
- 进化后的const分析
C语言中的const const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 注意:c ...
- 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修饰的 ...
- 第3课.进化后的const
1.c语言中 const修饰的变量是只读的,本质上还是变量 const修饰的局部变量在栈上分配空间(因为在栈上分配空间,所以我们可以通过改变这个空间的值.间接去改变这个变量.) const修饰的全局变 ...
- C++ 成员函数前和函数后加const修饰符区别
博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include< ...
- [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本
[阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...
- [Reprint]C++函数前和函数后加const修饰符区别
c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...
- C++函数前和函数后加const修饰符区别
class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...
- C++类的成员函数的形参列表后面的const
看到(C++ Primer)类的成员函数这里,突然对成员函数形参列表后面的const感到迷惑. 因为书中开始说是修饰隐含形参this的,然后又说是声明该函数是只读的. 大为不解! 翻资料.找人讨论.. ...
随机推荐
- hashset和treeset的区别
hashset 和 treeset的区别 hashset 和 treeset的区别 1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值. 2.HashSet ...
- TCP三次握手四次挥手详解2
相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...
- 大数据,why python
大数据,why python ps, 2015-12-4 20:47:46 python" title="大数据,why python">http://www.op ...
- Tomcat java.lang.OutOfMemoryError: PermGen space error
Often time, Tomcat may hits the following java.lang.OutOfMemoryError: PermGen space error. java.lang ...
- 【软件安装】Xshell + XFtp
[问题]xshell evaluation period has expired 今天发现一个xshell过期的事情,其实官方提供对应的校园版本供大家使用 进入官方下载地址:xshell地址 填写个人 ...
- RESTful源码学习笔记之RPC和Restful深入理解
以下资料搜集自网络 0x00 RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现 ...
- 20145311实验四 "Android开发基础"
20145311实验四 "Android开发基础" 程序设计过程 实验内容 ·安装Android Studio·运行安卓AVD模拟器·使用安卓运行出虚拟手机并显示HelloWorl ...
- 内核加载模块时出现Unknown symbol等提示
一.背景 1.更改了内核的配置,重新编译了内核 2.未重新编译内核模块 3.板子上只更新了内核,并未更新文件系统 二.分析 发现是在加载内核模块时出现Unknown symbol等信息,恰逢当时只更新 ...
- javascript中back(-1)和go(-1)的区别
javascript中back(-1)和go(-1)的区别 一.总结 一句话总结: 数据 history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1 ...
- JavaScript--变量和运算符
JavaScript--变量和运算符 一.心得 JavaScript语法:变量声明 var弱类型 var中可以是任何类型在JavaScript里面,单&单|是位运算符.变量没有值使用的话就是u ...