C的const和volatile

本文详细解析了C语言中const和volatile关键字的作用及区别,通过实验对比C和C++语言在这两个关键字上的表现,深入理解它们在编译过程中的行为及性能影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/songthin/article/details/1792068

但昨天和讨论中我才惊讶的发现,原来这两个关键字其实也被C语言支持。例如,如下代码在TC 2.0可以被正常编译并工作的很好:
const int a = 1;
volatile int b = 2;
其实,C支持这两个关键字也是理所当然的。对于volatile来说,在早期使用C语言编写中断服务程序是很常见的,如果一个变量会在中断服务程序中被修改,那么它应该被声明为volatile,这样就告诉编译器,不能对这个变量的值做任何假设,每次使用时必须重新获取,因为它很有可能已经在中断服务程序中被修改了;对于const来说,它告诉编译器被它所声明的量的值不可修改,虽然在运行时这并不能被保证,但至少在编译阶段的显式修改是可以被发现的。对此,不难发现C的const和C++的const是有所不同的,这里可以做一组实验来验证:
#include <stdio.h>
void main()
{
       const int a = 1;
       int* pa = (int*)&a;
       *pa = 2;
       printf("%d", a);
}
分别使用VC6和TC2编译这段代码,得到的结果是不同的。TC2(C语言)得到的结果为2,这很好理解,虽然a被声明为const,但我们还是可以通过指针来改变它的值;VC6(C++语言)得到的结果为1,这是因为在C++中const有两层含义,一是用来声明值不可改变的量,这等同于C语言中的意义,二是用来声明可以在编译期确定其值的量,这类似于C语言的#define。如果一个量的值确实可以在编译期算出来,那么编译器将尽可能对其进行优化,在之后用到此量的地方都直接用其值来代替,从而减少对内存的访问,以达到和#define相同的效率。
正是因为多了这一层含义,C++的教材上才说使用const和inline可以取代#define,不仅在功能上,而且是在性能上。假如C++的const仍然只具有和C语言的const一样的能力,那么它在性能上仍不能取代#define。看来,我当年读到的那本教材并没有把这个问题完全说清楚。
结论:
1 C语言支持const和volatile
2 C语言的const只保证量值不被显式修改,不进行性能上的优化


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值