zoukankan      html  css  js  c++  java
  • C++宏和枚举

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

    http://hovertree.com/menu/cpp/

    //定义四则运算的宏
    #define JIA     1
    #define JIAN    2
    #define CHENG   3
    #define CHU     4
    
    int main(void)
    {
        //保存用户输入的数
        int number1;
        int number2;
        int opt;//运算符
    
        //提示用户输入第一个数:
        printf("请输入第一个数:
    ");
        int r =scanf("%d",&number1);
        //查看Scanf是否收到了正确的数
        if(r==0){
            printf("别调皮,这样不好玩,我走了
    ");
            //程序退出
            return 0;
        }
    // 何问起 hovertree.com
        //提示用户输入第二个数
        printf("请输入第二个数:
    ");
        r = scanf("%d",&number2);
        if(r==0){
            printf("别调皮,这样不好玩,我走了
    ");
            //程序退出
            return 0;
        }
    
        //提示用户输入运算符
        printf("请输入运算符(%d%d%d%d分别对应加减乘除):
    ",JIA,JIAN,CHENG,CHU);
        r = scanf("%d",&opt);
        if(r==0){
            printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 我走了
    ");
            //程序退出
            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之一才行!走了
    ");
            return; //退出
        }
        //输出结果
        printf("%d+%d = %d
    ",number1,number2,result);
    
        return 0;
    }

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

    枚举

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

    enum OPT{
        jia = 1,
        jian,
        cheng,
        chu
    };
    
    int main(void)
    {
        //保存用户输入的数
        int number1;
        int number2;
        int opt;//运算符
    
        //提示用户输入第一个数:
        printf("请输入第一个数:
    ");
        int r =scanf("%d",&number1);
        //查看Scanf是否收到了正确的数
        if(r==0){
            printf("别调皮,这样不好玩,我走了
    ");
            //程序退出
            return 0;
        }
    
        //提示用户输入第二个数
        printf("请输入第二个数:
    ");
        r = scanf("%d",&number2);
        if(r==0){
            printf("别调皮,这样不好玩,我走了
    ");
            //程序退出
            return 0;
        }
    
        //提示用户输入运算符
        printf("请输入运算符(%d%d%d%d分别对应加减乘除):
    ",jia,jian,cheng,chu);
        r = scanf("%d",&opt);
        if(r==0){
            printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 我走了
    ");
            //程序退出
            return 0;
        }
    // 何问起 hovertree.com
        //程序运行到这里说明两次输入都正确
    
        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之一才行!走了
    ");
            return; //退出
        }
        //输出结果
        printf("%d+%d = %d
    ",number1,number2,result);
        return 0;
    }

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

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

    http://www.cnblogs.com/roucheng/p/cpp11.html

  • 相关阅读:
    使用BindingSource组件 将Windows Form控件绑定到通过调用XML Web服务获得的结果
    使用BindingSource组件将Windows Forms控件绑定到类型
    如何:用BindingSource将Windows Forms控件绑定到工厂对象
    如何:使用 Windows 窗体 BindingSource 组件对 ADO.NET 数据进行排序和筛选
    BindingSource
    DataSet
    C#里面如何判断一个Object是否是某种类型
    VS中提示:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值
    TableAdapter、Dataset与BindingSource的关系
    BASE64和图片之间的互相转换
  • 原文地址:https://www.cnblogs.com/roucheng/p/cpphong.html
Copyright © 2011-2022 走看看