回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C 语言基础教程 >> 31. 预处理指令 #define 和符号常量
最 近 更 新
54. goto 语句
53. switch 语句推荐
52. continue 和 break
51. 条件运算符(?:)
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
46. if 语句
45. 循环应用实例 2
最 新 推 荐
53. switch 语句推荐
50. if 语句嵌套推荐
49. 逻辑运算符推荐
48. 在循环中使用 if 语句推荐
47. if 和 else 连用推荐
44. 循环应用实例 1推荐
43. 循环嵌套推荐
40. for 循环推荐
37. 关系运算符推荐
36. while 循环推荐
热 门 排 行
2. 第一个 C 程序推荐
31. 预处理指令 #define..推荐
1. C 语言简介
11. 基本数据类型:整型..推荐
24. 运算符的优先级和结..推荐
5. 如何编写函数
30. 字符串字面量推荐
13. 标识符命名规则
36. while 循环推荐
7. 第三个 C 程序推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

31. 预处理指令 #define 和符号常量


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品
发布于2006-04-29 14:48 被读9304次 【字体:

Antigloss 最后更新于 2006-12-29

1. #define

    首先请看以下程序:

        #include <stdio.h>

        #define PERCENT 0.1

        int main(void)
        {
            int income = 4000;
            printf("%.2f", PERCENT * income);

            return 0;
        }

这个程序输出 400.00 。这是因为 #define PERCENT 0.1 定义了一个符号名symbolic name),这个符号名就是 PERCENT,它的值为 0.1。当程序被编译时,程序中所有在 #define PERCENT 0.1 后面的 PERCENT 都会被替换成 0.1。注意,必须完全匹配才会被替换,PERCENTS(如果有的话)绝对不会被替换成 0.1S !字符串常量也不会被替换。"PERCENT"(如果有的话)绝对不会被替换成 "0.1" !这种替换就是所谓的编译时替换。从源代码到可执行文件要经历三个阶段:预处理、编译,链接。编译时替换是在预处理阶段,由预处理器Preprocessor)完成的。上述程序预处理后变成:

        // 这里被替换成头文件 stdio.h 中的内容

        int main(void)
        {
            int income = 4000;
            printf("%.2f", 0.1 * income);      // PERCENT 被替换成 0.1

            return 0;
        }

    前面的教程中我们说过预处理指令 #include 是怎么工作的(点击查看)。这里的 #define 也是一个预处理指令,使用其定义符号名的方法为:

        #define  符号名  替换列表

符号名必须符合标识符命名规则(点击查看)。替换列表可以是任意字符序列,如数字、字符、字符串字面量、表达式等等。例如:

        #define  MSG   "I'm Antigloss!"   /* 后面的所有 MSG 都会被替换为 "I'm Antigloss!" */
        #define  SUM   50 + 99            /* 后面的所有 SUM 都会被替换为 50 + 99 */
        #define  BEEP  '\a'               /* 后面的所有 BEEP 都会被替换为 '\a'   */

注意,预处理指令 #define 的最后面没有分号(;),千万不要画蛇添足!

    如果替换列表由值为常量的表达式构成,习惯上我们把其对应的符号名称为符号常量symbolic constant)。习惯上我们用大写字母来命名符号常量,而用小写字母来命名变量。

    切记,符号名之后,换行之前的一切内容都属于替换列表(当然,注释除外),后面所有出现符号名的地方都会被替换成与该符号名相应的替换列表中的内容。千万别犯这种低级错误:

        #define STEP = 20

如果你这样做了,后面的 STEP 都会被替换成 = 20 。这样的话,类似

        total_min = min * STEP;

的语句就会被替换成

        total_min = min * = 20;    // 错误

2. const 修饰符

    我们也可以使用 const 修饰符来定义常量

        const int INCOME = 4000;   // INCOME 是常量,它的值是 4000

以上语句声明了一个 int 型常量。我们只能读取 INCOME 的值,而不能修改它的值。通常,我们把这种常量也称为符号常量。

3. 使用符号常量的好处

    符号常量可以提醒我们它的作用。例如:

        tax = income * PERCENT;
        tax = income * 0.1;

第二个语句中的 0.1 让人摸不着头脑,不知道它是干什么的;而第一个语句,看到 PERCENT 我们就可以知道这是一个百分比。

    如果程序中多个地方使用了同一个常量(如 0.1),当我们需要修改这个常量时,必须修改用到该常量的所有地方。工作量大暂且不提,更可怕的是我们可能会漏改、错改,或者误改了某些不该改的常量。而使用符号常量就不同了。我们只要把符号常量的值改掉就行了。

参考资料:C Primer 5th Edition
          The C Programming Language 2nd Edition
          C99 标准

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:暂无相关专题

上一篇:30. 字符串字面量
下一篇:32. sizeof 运算符

共有评论 1 条 网友评分 3分 查看全部评论

游客:余昌和
评分:5
讲解的非常到位,很详细,很想今后能得到你的帮助.能否加我的QQ:408820601,Email:ych0913@sina.com

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss