我们在使用c语言编写程序的时候经常会对常量进行存储,以下是常用的方法:
1.使用宏定义define 储存常量,方法如下:
define PI 3.14
该命令允许把PI指定成3.14这个常量。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。使用宏定义的好处是可以统一管理变量,需要更改时只要修改宏定义即可,非常方便。但是使用宏的编译是发生在预编译的阶段的,预编译并不进行类型的检测。比如说,我们希望PI的值是3.14的浮点型,但是如果我们手误把它写成"hello world"字符串类型,它也是不会提示警告和错误的,这样程序安全性还不够高;那有什么方法可以尽量避免这总问题呢?竟然我们希望编译器进行类型检测,那我们首先就可以想到用常见的定义变量来储存常量。方法如下:
2.使用变量来储存常量
float pi=3.14;
使用变量储存常量是常见方式,好处是编译器会在编译的过程中检测变量的类型,避免上述的问题发生。但是这种方法有个很明显的缺点,那就是变量是可以改变的,在程序的运行中可能会遇到不易发现的bug或者自己的纰漏,造成程序运行的过程中,值发生变化,使得程序的运行结果出现了误差。那又如何解决这个问题呢?
3.使用c语言中提供了关键字const来解决:
const float pi=3.14;
首先我们来了解一下关键字const的作用:
如果一个变量被const修饰,那么它的值就不能再被改变,可以保护被修饰的东西,防止意外修改,增强程序的安全性。
在使用了const修饰后,如果变量被改变,编译器会产生错误提示,如:
#include <stdio.h>
int main(void)
{
const float pi=3.14;
pi=3.15;
return 0;
}
[错误] assignment of read-only variable 'pi'
其实被const修饰的变量也是可以改变的,方法就是使用指针间接改变,方法如下:
#include <stdio.h>
int main(void)
{
const float pi=3.14;
const float *p=π
*p=3.15;
return 0;
}