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用于声明一个常量,即变量的值在声明后不能再被修改。被const修饰的变量只能读取其值,不能修改。 在引用的代码中,第四道代码声明了一个指针p,该指针指向一个常量int型变量a。这意味着p所指向的值不能被修改,同时p本身也不能指向其他的变量。因此,对p进行赋值或者修改*p的值都是非法的操作。 在引用的代码中,const修饰的变量a被声明为常量,即a的值不能被修改。当尝试修改a的值时,编译器会报错。 总结起来,C语言关键字const用于声明常量,常量的值在声明后不能再被修改。常量可以修饰变量或指针,使其成为只读或只指向特定变量的指针。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言关键字const详细讲解](https://blog.csdn.net/li1829146612/article/details/119636084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [[C语言]const关键字详解](https://blog.csdn.net/yjlyyj/article/details/125259458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C语言关键字const和指针的结合使用](https://download.csdn.net/download/weixin_38499706/12743173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值