成为C++高手之宏与枚举

我们的计算器程序,用1234对应加减乘除,对于人阅读很产生一点障碍。隔一个月后再看此代码可能想不起是0123还是1234了,还得去代码中查找,如果能为代表四则运算的四个数取个有意义的别名就好了,一看是知道对应什么。没问题,用宏啊。以下是我们的计算器程序第五版:

//定义四则运算的宏
#define JIA     1
#define JIAN    2
#define CHENG   3
#define CHU     4

int main(void)
{
    //保存用户输入的数
    int number1;
    int number2;
    int opt;//运算符

    //提示用户输入第一个数:
    printf("请输入第一个数:\n");
    int r =scanf("%d",&number1);
    //查看Scanf是否收到了正确的数
    if(r==0){
        printf("别调皮,这样不好玩,我走了\n");
        //程序退出
        return 0;
    }

    //提示用户输入第二个数
    printf("请输入第二个数:\n");
    r = scanf("%d",&number2);
    if(r==0){
        printf("别调皮,这样不好玩,我走了\n");
        //程序退出
        return 0;
    }

    //提示用户输入运算符
    printf("请输入运算符(%d%d%d%d分别对应加减乘除):\n",JIA,JIAN,CHENG,CHU);
    r = scanf("%d",&opt);
    if(r==0){
        printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 我走了\n");
        //程序退出
        return 0;
    }

    //程序运行到这里说明两次输入都正确
    int result;//存放计算结果

    //跟据运算符进行不同的运算
    switch(opt){
    case JIA:
        //加
        result = number1+number2;
        break;
    case JIAN:
        //减
        result = number1-number2;
        break;
    case CHENG:
        //乘
        result = number1*number2;
        break;
    case CHU:
        //除,现在只能整除
        result = number1/number2;
        break;
    default:
        printf("运算符必须是1,2,3,4之一才行!走了\n");
        return; //退出
    }
    //输出结果
    printf("%d+%d = %d\n",number1,number2,result);

    return 0;
}

宏名习惯性全部大写,定义宏不需要分号结束。宏的实质就是替换。在编译时,第一步就是把代码中的宏用实际的值代替。用宏还一个好处,当你把宏对值改动的话,程序其余地方不用动。比如你可以把1234,改成0123,程序照样运行不出错。

枚举

但是,除了宏之外,还可以使用枚举。如是:

enum OPT{
    jia = 1,
    jian,
    cheng,
    chu
};

int main(void)
{
    //保存用户输入的数
    int number1;
    int number2;
    int opt;//运算符

    //提示用户输入第一个数:
    printf("请输入第一个数:\n");
    int r =scanf("%d",&number1);
    //查看Scanf是否收到了正确的数
    if(r==0){
        printf("别调皮,这样不好玩,我走了\n");
        //程序退出
        return 0;
    }

    //提示用户输入第二个数
    printf("请输入第二个数:\n");
    r = scanf("%d",&number2);
    if(r==0){
        printf("别调皮,这样不好玩,我走了\n");
        //程序退出
        return 0;
    }

    //提示用户输入运算符
    printf("请输入运算符(%d%d%d%d分别对应加减乘除):\n",jia,jian,cheng,chu);
    r = scanf("%d",&opt);
    if(r==0){
        printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 我走了\n");
        //程序退出
        return 0;
    }

    //程序运行到这里说明两次输入都正确

    int result;//存放计算结果
    //跟据运算符进行不同的运算
    switch(opt){
    case jia:
        //加
        result = number1+number2;
        break;
    case jian:
        //减
        result = number1-number2;
        break;
    case cheng:
        //乘
        result = number1*number2;
        break;
    case chu:
        //除,现在只能整除
        result = number1/number2;
        break;
    default:
        printf("运算符必须是1,2,3,4之一才行!走了\n");
        return; //退出
    }
    //输出结果
    printf("%d+%d = %d\n",number1,number2,result);
    return 0;
}

枚举有名字,我们这个枚举叫OPT。枚举虽然看起来像结构,但是枚举与结构完全不是一回事。枚举的每一项就是为一个整数取了个名字,每一项都是一个常量,而不是的成员变量。枚举的用处更像是把表示某种东西的相关值组织到一起,而宏就做不到了。比如四则运算的宏,每一项都可以随意找位置放,它们不紧邻也没有语法错误。而枚举是强制把相关的项放在一起。

枚举的项的名字一般不大写,当然你可以像宏一样大写。只要你整个工程中都能坚持统一的风格就行了。

注意,本系列文章必须结合视频教程 http://edu.csdn.net/course/detail/2057 才能取得快速入门的效果。欢迎加入群535807023讨论。

上一篇:成为C++高手之if与switch

时间: 2024-11-06 10:29:50

成为C++高手之宏与枚举的相关文章

2015.12.14 宏定义 枚举 动态内存分配

宏定义 (#define) 宏定义的意义和用途:(习惯上,都是“k”开头) 1.为了让一些数据有意义. 2.类似于内联函数(使用简便). 3.输出日志的开关. (非零即真,0为“发布阶段”,1为“开发阶段”) 枚举 (enum) 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 默认情况下,枚举中每个元素的基础类型是 int.可以使用冒号指定另一种整数值类型.默认是从0开始,后者会在前者之上+1. 动态内

C++宏和枚举

宏 我们的计算器程序,用1234对应加减乘除,对于人阅读很产生一点障碍.隔一个月后再看此代码可能想不起是0123还是1234了,还得去代码中查找,如果能为代表四则运算的四个数取个有意义的别名就好了,一看是知道对应什么.没问题,用宏啊.以下是我们的计算器程序第五版: http://hovertree.com/menu/cpp/ //定义四则运算的宏 #define JIA 1 #define JIAN 2 #define CHENG 3 #define CHU 4 int main(void) {

成为C++高手之while循环

我们的计算器还有好多问题,我们一个个解决. 本节解决用户输错就退出的问题.我们应该在用户输错时,提示并让其重新输入,如果一直错就一直提示,直到输对.用while循环语句做比较合适,如下: //提示用户输入第一个数,需循环直到用户输入正确的数: int r; while(1){ printf("请输入第一个数:\n"); r = scanf("%d",&number1); //查看Scanf是否收到了正确的数 if(r==0){ printf("别调

枚举宏(Adopting Modern Objective-C)

使用NS_ENUM 和 NS_OPTIONS宏定义枚举.Adopting Modern Objective-C 使用NS_ENUM宏定义一组互斥的枚举值: typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };//类型名

成为C++高手之头文件

但现在看起来真不爽,main.c依赖的文件不能在工程中管理,要修改那些文件的话麻烦大了.如何既能分成多个文件又能在工程中看到呢?可以,使用头文件(h文件). 头文件中只放那些不产生内存占用的代码,比如定义结构(定义结构不会产生内存分配,只有用结构定义变量时才产生内存分配).定义枚举,定义宏,声明变量,声明函数等.而且大都是一个c文件对应一个h文件.下面增加poker.h和player.h(注意main.c是不需要有h文件的,因为我们应该保证main.c只依赖别的文件,而不能被别的文件依赖),下面

成为C++高手之头文件与条件编译

书接上回(http://blog.csdn.net/niu_gao/article/details/51478789). 但现在看起来真不爽,main.c依赖的文件不能在工程中管理,要修改那些文件的话麻烦大了.如何既能分成多个文件又能在工程中看到呢?可以,使用头文件(h文件). 头文件中只放那些不产生内存占用的代码,比如定义结构(定义结构不会产生内存分配,只有用结构定义变量时才产生内存分配).定义枚举,定义宏,声明变量,声明函数等.而且大都是一个c文件对应一个h文件.下面增加poker.h和pl

成为C++高手之最终版计算器

下面做我们的计算器最终版. 当前还存在的问题是用户只能算一次.如果有人买一个一次性计算器,那么他肯定是个土豪.我们的计算器不能只给土豪用,所以要改成可以反复使用的. 使用循环语句就可以了,但是循环哪些代码呢?从用户输入到打印出结果这个过程要反复执行,代码如是: enum OPT{ jia = 1, jian, cheng, chu }; int main(void) { //保存用户输入的数 int number1; int number2; int opt;//运算符 //循环从输入到输出结果

【转】枚举常量

1.枚举常量的定义 enum 枚举类型名{常量1,常量2,常量3,.......}: 例如定义一个星期的枚举常量:enum Week {Mon,Tue,Wed,.....}: 这就定义了一个新的数据类型:Week. Week数据类型来源于int类型(默认). Week类型的数据只能有7种取值,它们是:SUNDAY,MONDAY,TUESDAY……SATURDAY. 其中SUNDAY = 0,MONDAY = 1……SATURDAY = 6.也就是说,第1个枚举值代表0,第2个枚举值代表1,这样依

DELPHI设置枚举类型size

delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难. 经过查找资料,原来delphi可以通过{$Z+} {$Z-} {$Z1} {$Z4} 等宏设置枚举类型的长度,小至1个字节,大至4个字节. 官方说明如下: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/comp