我的一个长久以来的误区,关于C

原创 2007年09月19日 22:46:00
 
我的一个长久以来的误区,关于C
 
很久以前学C语言的时候就知道了#define,它可以用来定义宏,宏至少有两个作用,一是作为常量,二是作为很短的函数或代码段。后来学到C++,提到了取代#define的两个关键字,一是const,一是inline。上大一的时候学校也开了C语言课,后面有一章是介绍C++,其中涉及到C++的两个关键字,分别是const和volatile,前者用来定义常量,后者用来定义会被其他地方修改的变量。由此我得到一个认识,就是const和volatile并不被C支持,而是C++才具有的关键字。
但昨天和讨论中我才惊讶的发现,原来这两个关键字其实也被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只保证量值不被显式修改,不进行性能上的优化
 

C/C++笔记--String类的书写及易错点分析

CMyString { public: CMyString(const char* pData = NULL); CMyString(const CMyString &other); ...
  • ZH___xin
  • ZH___xin
  • 2016年08月20日 12:22
  • 349

C/C++基础::sizeof() 与 sizeof(string)

sizeof(string 对象) ≠ string 对象的.size()成员函数(.size()与.length()不作区别,返回 string 的字符个数) string 的实现在各库中可能有所不...
  • lanchunhui
  • lanchunhui
  • 2016年02月25日 16:05
  • 2025

C11: Localizing 网站的本地化

使用Global Resources Global resources 被所有的页面、控件、类共享,最适于存储多国语言数据。这里的数据不仅包括字符串,而且包括图片,图标,声音,和任何其它二进制内容。这...
  • bottlebox
  • bottlebox
  • 2007年12月20日 23:05
  • 810

几个常见思维误区

有很多人大学毕业后,还是保持学习,这其实挺好的。但进入社会开始工作后,现在的学习跟大学时候的学习肯定是有区别的。最大的区别是,这个时候你所学的要用起来创造价值。 思维方式出问题 考场逻辑:我没有准...
  • luopeng123456789
  • luopeng123456789
  • 2015年10月14日 15:58
  • 505

C++ 异常处理 入门

C++ 异常处理 入门异常:程序执行期间,可检测到的不正常情况。例如:0作除数;数组下标越界;打开不存在的文件;远程机器连接超时;malloc失败等等。程序的两种状态:正常状态和异常状态,发生不正常情...
  • tuwen
  • tuwen
  • 2008年04月16日 09:45
  • 29804

从C到C++要注意的33件事(0)

因为最近由于工作的原因,主要的编程语言从用了10多年的C切换到了C++,在实际应用中才发现,有些地方还是很困难的,所以也是为了自己的积累,在这里分享一些从C转变到C++的一些注意点。 1.头文件的包含...
  • superkunkun
  • superkunkun
  • 2016年11月21日 21:35
  • 602

这是我长久以来的愿望

这是我长久以来的愿望,可惜一直没有实现,总以工作忙找借口,其实与其说工作忙不如说自己懒惰。 今天开始了,能否坚持,还得看明天。。。。。。    ...
  • acosoft
  • acosoft
  • 2009年07月07日 19:03
  • 691

谈谈敏捷开发的误区

今天有人做演讲有关敏捷开发的。就演讲而言,讲得非常好,吐字清晰,语速适当,穿插例子,娓娓道来,将意思表达得非常清楚到位,是个很好的演讲。但就内容而言,我却有很大的异议,当中部分观点我认为是对敏捷开发的...
  • flowingflying
  • flowingflying
  • 2013年01月23日 23:12
  • 2641

VS2010 C/C++实用操作

本文的主要内容来自各个博客和论坛,在此处只是仅仅做引用备份。1. 寻找文件的父目录 在程序中经常需要打开一个文件,同时获取其所在的目录。参考网络上的论坛(具体链接已经忘记),代码如下: si...
  • u012348774
  • u012348774
  • 2017年03月09日 10:29
  • 577

c++ 中文字符串处理方法

C++处理中文的问题困扰我很久了。之前一旦遇到中文基本就投诸java怀抱了。 今天看到一个漂亮的c++程序,遂豁然开朗。总结一下分享给大家:   问题描述: c++ 中 char*/strin...
  • ts_rfl
  • ts_rfl
  • 2012年01月17日 14:42
  • 12250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的一个长久以来的误区,关于C
举报原因:
原因补充:

(最多只允许输入30个字)