为什么直接常量占存储单元,而符号常量不占存储单元?
比如:
#define PI 3.1416
在预编译的时候把PI替换成了3.1416,但是在代码中3.1416不是相当于一个实型常量吗?
const int a=6;
在内存空间中a占用存储单元,6占用吗?
符号常量会在预处理阶段由预处理器用它的定义直接替换,到编译阶段符号常量根本就不存在了,是不会分配内存的。
好像变量会占用内存空间的。 常量不会占用内存空间。
常变量会占用内存空间,由于有些人把常变量划分到常量里面,所以常变量又叫const常量,常变量具有变量的属性,会占用内存空间,只是值不会改变罢了。
回答:
符号常量不占用存储单元,是因为它在预处理阶段就已经被替换成了具体的常量值,所以在编译阶段和运行阶段都不存在符号常量的概念。而直接常量是在代码中直接使用的常量值,会在运行时占用存储单元。
对于C语言中使用预处理指令#define定义的符号常量,例如定义PI为3.1416,预编译阶段会将PI替换为3.1416,替换操作是简单的文本替换,不会占用任何实际的存储单元。
相反,使用const关键字定义的直接常量在代码中会占用存储单元。例如使用const int a = 6;定义整型常量a,编译器会为a分配存储单元,并在程序运行期间保持其值不变。这意味着a会占用实际的存储单元,可以进行一些针对a的操作,例如取地址,传递给函数等。
所以,符号常量和直接常量在存储时的差异主要是因为符号常量在预处理阶段就被替换成了常量值,而直接常量在代码中保留自己的存储单元。
对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!)
符号常量与普通常量不同之处在于,符号常量在预处理阶段就已经被替换成常量值了,因此不会占用内存,而const声明的变量有变量的性质,会在代码运行时占用内存空间