以下代码编译运行平台是 Windows 64bits+VS2017。


使用 C++ 编程时,经常遇到以下几个概念:常量、文字常量、字面常量、符号常量、字符常量、常变量、字符串常量等,网上的资料描述的不尽相同,弄得大家云里雾里。本文将尝试为大家捋清楚以上易混淆概念的定义、关系和区别。

常量指值不可改变的量,在 C++ 中常量分为两种,文字常量(Literal Constant)和常变量(Constant Variable)。

文字常量和常变量的本质区别: 文字常量编译之后存储在代码段,不可寻址,常变量存储在数据区(堆、栈、数据段、BSS 段),可寻址。

1.文字常量

文字常量又称为“字面常量”,包括数值常量字符常量符号常量。其特点是编译后写在代码区,不可寻址,不可更改,属于指令的一部分。

int& r=5;   //编译错误

这条语句出现编译错误,原因是文字常量不可寻址,因而无法为文字常量建立引用。下面这条语句又是合法的:

const int& r=5;

原因是编译器将一个文字常量转化成常变量的过程。在数据区开辟一个值为5的无名整型常变量,然后将引用r与这个整型常变量进行绑定。

数值常量: 包括整型常量和实型常量。整型常量指常整数,有十进制、八进制、十六进制三种表示形式。实型常量包括单精度浮点数(float)、双精度浮点数(double)和长双精度浮点数(long double),表示形式有科学计数法和非科学计数法。

int a=4;            //4为数值常量中的整型常量
float b=4.4;       //4.4为数值常量中单精度实型常量
double c=1.4e10;   //1.4e5表示的值为1.4×10^5,是数值常量中双精度实型常量

字符常量: 指 ASCII 字符,有128个,分为普通字符和转义字符。普通字符指可直接书写的字符,如’a’和’b’。转义字符指不能直接书写的特殊字符,需要使用反斜杠进行表示,比如’\t’表示水平制表符,’\v’表示垂直制表符。

符号常量: 用标识符代表一个常量,使用之前必须定义。例如宏定义和枚举元素。

#define NUM 100  // NUM 为符号常量,100 为数值常量
enum Weekday{SUN, MON, TUES, WED, THU, FRI, SAT};   //SUN,MON等均为符号常量

2.常变量

常变量指定义时必须显示初始化且值不可修改的变量。与其他变量一样被分配空间,可以寻址。注意,字符串常量是常变量的一种,名称为其本身,存储在代码段,可寻址但不可修改。

cout << &”hello world” << endl;  // 打印输出字符串常量”hello world”存储地址

常变量在 C++ 中由 const 关键字来定义,分为全局常变量和局部常变量。

二者的区别在于:全局常变量存储在代码段的只读内存区域,不可修改有操作系统来保障,局部常变量存储在栈区,在编程语言语义层面上由编辑器做语法检查来保障其值不可修改,因不是放在只读内存中,可以获得局部常变量的地址,运行时间接修改。参考如下代码:

#include <iostream>
using namespace std;const int con1=3;
void showValue(const int& i) {cout<<i<<endl;
}int main(int argc,char* argv[]) {const int con2=4;int* ptr=NULL;ptr=const_cast<int*>(&con2);*ptr=5;showValue(con2);              //1,输出5cout<<"con2:"<<con2<<endl;        //2,输出4ptr= const_cast<int*>(&con1);*ptr=6;                          //3,运行时错误,写入冲突
}

程序 1 处输出 5,表明局部常量 con2 的值已经被修改,2 处输出为结果仍然为 4,并不是说明常变量 con2 的值没有被修改,而是因为编译器在代码优化的过程中已经将 con2 替换成了文字常量 4。程序 3 处,运行时出错,表明全局常变量存储在只读内存,无法间接改写。

有关 C++ 程序内存分区可参见博客程序内存布局。


参考文献

符号常量与常变量的区别
百度百科.符号常量
百度百科.字符常量
百度百科.常量
陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008

C++ 文字常量与常变量相关推荐

  1. 2021-09-13 文字常量和常变量

    1.2 文字常量和常变量 常量可以直观地理解成"值不可改变的量".在C++语言中,常量分为两种:文字常量(literal constant)和常变量(constant variab ...

  2. C++/C中const的区别(常量和常变量)

    1. C语言中被const修饰的叫常变量 #include <stdio.h>void main() {const int v; //ok } C语言中,const修饰的量可以不初始化,但 ...

  3. C语言的常量、变量和常变量

    在计算机高级语言中,数据有两种表现形式:常量和变量. 一.常量 常量的定义:在程序执行过程中,不能被改变的量. 常量分为5种:整形常量.实型常量.字符常量.字符串常量.符号常量. 整型常量: 如0,1 ...

  4. 【C/C++】符号常量 常变量

    1.常量 在程序运行过程中,其值不能被改变的量叫做常量. 常用的常量有如下几类: 整型常量 实型常量 字符常量 普通字符 转义字符 如:\\表示一个反斜线:\n表示换行,将当前位置移到下一行的开头:\ ...

  5. C语言基础1:初识C语言(转义、注释;数组、操作符、反码、补码、static、define、指针、结构体常变量;局部变量;作用域、生命周期)

    文章目录 C语言基础1:初识C语言 1.C语言简介 1.1什么是C语言 1.2C语言的发展 2.第一个C语言程序 2.1创建项目 2.2添加源文件 2.3写代码 3.数据类型 4.变量.常量 4.1定 ...

  6. 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释

    1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...

  7. 老生常谈:文字常量区的那点事

    2019独角兽企业重金招聘Python工程师标准>>> 文字常量区,在之前的一篇关于堆栈的文章中有所提及,今天在重点说一下文字常量区,在该区内存放常量字符串,为什么这么做了,就是节省 ...

  8. 常指针、指向常量的指针、指向常量的常指针

    三者的区分 简而言之- 常指针:地址不可变,内容可变 指向常量的指针:地址可变,内容不可变 指向常量的常指针:地址不可变,内容不可变 样例 代码如下: #include <iostream> ...

  9. 栈区,堆区,全局区,文字常量区,程序代码区详解(程序中不同类型数据所在区)

    一.预备知识-程序的内存分配     一个由C/C++编译的程序占用的内存分为以下几个部分     1.栈区(stack)-   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其   ...

最新文章

  1. 算法 | 动画+解析,轻松理解「Trie树」
  2. IE11下载文件时出现文件名乱码
  3. hdu4585 amp; BestCoder Round #1 项目管理(vector应用)
  4. UA MATH567 高维统计IV Lipschitz组合8 随机投影与John-Lindenstrauss引理
  5. 程序员的数学笔记1--进制转换
  6. 浅谈c++静态绑定、动态绑定
  7. 解决webstorm中vue语法没有提示
  8. 软工专硕考研_2021考研人数将突破400万?录取率或成史低!
  9. Java实验8 T6.绘制一个二叉树
  10. 解析nextTick---vue3任务调度
  11. iOS开发特效源码:swift轮播图导航渐变跑马灯分段选择下拉菜单物流时间轴
  12. linux 零拷贝golden,GoldenGate碎碎念
  13. codeproject.com被封了?
  14. c语言开发excel带比例的饼图,教大家Excel饼图中既显示百分比又显示数量的方法...
  15. OneNote的同步问题
  16. vi 和 vim 编辑器的使用
  17. 应用多开,定位,机型伪装这都有
  18. 使用百度文字识别API进行图片中文字的识别
  19. 高级搜索:搜索指定网址
  20. 第3.8节 Python百分号占位符的字符串格式化方法

热门文章

  1. 前端:高德地图快速入门使用
  2. 【Oracle学习笔记】
  3. VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法
  4. 关于http的各种状态码--内容转自其他博客
  5. android Log工具框架,LogUtils让你摆脱TAG的魔爪
  6. 使用zabbix监控MongoDB
  7. tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
  8. 【简报】超棒的免费Web字体服务:Adobe Edge Web字体
  9. 开启服务器,自动加载类是否需要开辟新的线程研究
  10. css 剩余空间,CSS DIV高度撑满剩余空间