C++ 文字常量与常变量

以下代码编译运行平台是 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,输出5
	cout<<"con2:"<<con2<<endl;		//2,输出4
	ptr= const_cast<int*>(&con1);
	*ptr=6;							//3,运行时错误,写入冲突
}

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

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


参考文献

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

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值