C语言关键字浅析-const
### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
const关键字是ISO/ANSI C90标准新添加的关键字之一
同期的“新生”还有enum、signed、void、volatile
其原本的单词为Constant,即常量
作为一种在定义的时候常见的关键字
const一般用于声明一个变量,其值在初始化后不能再改变
const的作用是:
声明常量,常量的值不可修改。
1、常量本身的意义
生活中我们会遇到很多变量,比如环境监测上需要的温湿度数据,几乎是一直处在变化之中的
但生活中很多事物本身存在不变的量,即常量,如圆周率Pi,一年一定有12个月,一定有四季等等
在编写一个程序的时候,我们也可能经常遇到常量:
/*求限高为3.14的圆柱形容器在给定半径下的容量
*/
double getContent(double R)
{return 3.14 * R * R * 3.14; /* 直接在表达式中用数值,语法上正确,小型程序可能也没大问题,但大型程序、多人员参与的情况下可能导致误解 */
}
也许这并不是一个明显的例子,再看下面这种情况:
/* 求限高为3.14的圆柱形容器在给定半径下的容量 */
double getContent(double R)
{return 3.14 * R * R * 3.14; /* 有同值不同义的常量 */
}/* 求顶盖面积 */
double getTopArea(double R)
{return 3.14 * R * R;
}/* 求外围铁箍需要的铁皮面积 */
double getIronHoopArea(double R)
{return 3.14 * 2 * R * 0.03; /* 一个表达式多个常量 */
}
首先第一个函数,出现值相同的常量,如果其存在于表达式中不同优先级的运算符旁,可读性上的隐患可能导致bug
第二个函数在本例子中最幸运的就是,基本所有人见到3.14都能想到圆周率,如果这里只精确到3可能直观上看不出这是在算面积
第三个函数的表达式存在3个常量,正如上一句所言,直观上看我们看不出最后的0.03是什么意思,如果圆周率只精确到3,那更悲剧
如果这样写呢:
const double PI = 3.14; /* 圆周率-本程序只精确到e-2 */
const double CONTENT_HEIGHT = 3.14; /* 容器固定高度 */
const double IRON_HOOP_WIDTH = 0.03; /* 容器外围铁箍宽度 *//* 求限高为3.14的圆柱形容器在给定半径下的容量 */
double getContent(double R)
{return PI * R * R * CONTENT_HEIGHT;
}/* 求顶盖面积 */
double getTopArea(double R)
{return PI * R * R;
}/* 求外围铁箍需要的铁皮面积 */
double getIronHoopArea(double R)
{return PI * 2 * R * IRON_HOOP_WIDTH;
}
首先,程序所需的圆周率精度可以更快捷的调整了,如果说最初你需要把圆周率从3.14全部修正到3.14159,你的时间复杂度是O(n),因为你要一个一个3.14地去改,而你使用const后只需要O(1),因为这里是全局变量,定义后的PI在everywhere都代表3.14159
其次你获得了更好的可读性,表达式很直观,甚至能直接看出数学公式的格式
2、系统定义常量
在C头文件limits.h和float.h中有提供方便开发人员使用的明显常量
如CHAR_BIT是指一个char的位数,INT_MAX是指int类型的最大值
如果你知道这些你本应该享受的服务的话,下次写INT_MAX就不用到处去问去找int的最大值是多少了,然后回来默默写个32767
3、保护数组
这时候const并不一定存在于常量定义的位置,而是去说明数组内容不可改变
/*显然,grade[]数组并不是固定不变的,也不能是固定的,但此刻在这个函数中我们不希望因为开发人员本身留下的错误,即可能错误地修改了数组的值,我们对形式参数使用const,表示该函数中的grade数组当做const常量看待
*/
int getAverage(const int grade[], int n)
{int i, average;average = 0;for(i = 0;i < n;i++)average += grade[i]; /* 如果犯错写成了grade[i]++,除了上帝编译器也能原谅你了 */return average / n;
}
4、指针与const的一点内容
我们知道这样的一种格式:
int a[5] = {1,2,3,4,5}; /* 数组 */
int *p = a; /* 指针p指向数组头元素,也可以对数组元素操作 */
我们来“钻个空子”:
int a[5] = {1,2,3,4,5}; /* 数组 */
const int *p = a; /* 指针p虽然指向了数组a,但只可访问不能修改值 */
这种玩儿法是这样的:你照样可以肆意妄为地修改a数组的元素的值,因为a不是常量,但一向被认为指针即变量本身的p变量此时被const下了紧箍咒,即p[2] = 312;非法,p虽然是a数组本身但只能“看”着,不能上手改。
——参考《C Primer Plus第五版》
C语言关键字浅析-const相关推荐
- C语言关键字浅析-enum
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### enum关键字的原型是enumerated type,意思是枚举类型 这是ISO/ANSI C90标准新增的关键字之 ...
- C语言关键字浅析-return
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### return关键字是C程序中最常见的关键字之一 对于一个最简单的demo程序,或者说你最早接触的HELLO WORL ...
- C语言关键字浅析-double
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### double关键字声明一种称之为"双精度"的浮点数据类型 其"双"之处在于与 ...
- C语言关键字浅析-float
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### float从单词的字面上看是"浮动"的意思 在C语言中,float表示一种基本数据类型,浮点型, ...
- C语言关键字浅析-do
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### do关键字在C语言中不能单独使用 它需要和while关键字配套使用表示一种退出条件循环结构 其区分于while循环和 ...
- C语言关键字浅析-while
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### while在英文中常被翻译为"在--的时候,当--时",私以为在C语言的while里,应当为&q ...
- C语言关键字浅析-_Imaginary
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### _Imaginary是C99新增的关键字,表示一种基本数据类型--虚数 与_Complex一样,该类型的出现主要是为 ...
- C语言关键字浅析-short
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### short,本意是"短,矮"的意思,在C语言中声明一种短整数类型,与long相对应 short与 ...
- C语言关键字浅析-switch
### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### switch在英文中是"开关"的意思,比如switch on和switch off可以表示电灯的 ...
最新文章
- Nosql数据库之mongodb c++使用实例
- Mysql 将一张表的数据插入到另一张表中
- 生物化学与分子生物学分析技术 Analytical Techniques in Biochemistry and Molecular Biology 英文原版
- MybatisPlus介绍
- 线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法
- Java Executors(线程池)
- CentOS7设置自定义开机启动,添加自定义系统服务
- 面向对象真的需要继承吗?
- asp mysql 设置编码_ASP对数据库各种操作的代码
- Java文件流字节流和字符流的区别
- PHP学习笔记:利用百度api实现手机归属地查询
- 深度神经网络编程细节
- MyBatis如何返回自增的ID
- ubuntu 下mysql 不显示当前的数据库名解决方法
- 淘宝PK京东:哥刷的不是广告,刷的是存在
- linux中的日志切割
- ad采样的符号位_AD位数是如何影响信号幅值的?
- 智能家居无线方案ZIGBEE、Z-Wave、WIFI、蓝牙、红外、GPRS以及NB-IOT对比
- Julia-第一章简介和资源汇总
- Photoshop保存图片时闪退