C++宏和枚举

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

我们的计算器程序,用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("请输入第一个数:\n"); int r =scanf("%d",&number1); //查看Scanf是否收到了正确的数 if(r==0){ printf("别调皮,这样不好玩,我走了\n"); //程序退出 return 0; } // 何问起 hovertree.com //提示用户输入第二个数 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; } // 何问起 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之一才行!走了\n"); return; //退出  } //输出结果 printf("%d+%d = %d\n",number1,number2,result); return 0; }

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120538.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 五笔字根口诀_五笔拆字口诀和方法详解

    五笔字根口诀_五笔拆字口诀和方法详解一、五笔字根表二、五笔字根口诀12G王旁青头戋(兼)五一(“兼”与“戋”同音)H目具上止卜虎皮(“具上”指具字的上部)F土士二干十寸雨(可别忘了革字底)J日早两竖与虫依D大犬三羊古石厂(羊底龙头套上套下)K口与川,字根稀S木丁西L田甲方框四车力(“方框”即“口”)A工戈草头右框七(“右框”即“匚”)M山由贝,…

  • smalldatetime java,如何在数据导入期间将平面文件中的dd-mmm-yy值格式化为smalldatetime?…[通俗易懂]

    smalldatetime java,如何在数据导入期间将平面文件中的dd-mmm-yy值格式化为smalldatetime?…[通俗易懂]IhaveaflatfilewhichisimportedintoSQLServerviaanexistingSSISpackage.Ineedtomakeachangetothepackagetoaccommodateanewfieldintheflatfile.Thenewfieldisadatefieldwhi…

  • 13个免费资源网站,你想要的全都有!【各类宝藏资源,建议收藏】

    13个免费资源网站,你想要的全都有!【各类宝藏资源,建议收藏】前言前段时间,博主写了一篇文章关于如何用Python自制一款音乐播放器,有不少粉丝私信我说,这些高颜值UI设计模板都是从哪里找的,可以把网址分享出来嘛~当然没问题,今天就把多年收藏整理的各类资源网站全都分享出来,都是完全免费的“资源”网站,质量非常高,一起来看看吧!1.虫部落网址:https://search.chongbuluo.com功能特点:聚合搜索平台,集成了100多个搜索引擎,包含了搜问题、找图片、听音乐、下文档资料、查代码等等,各种需要这个网站都有。其中还包含了学术搜索引擎,非常适

  • 剑指Offer面试题:13.合并两个排序的链表

    一题目:合并两个排序的链表二代码实现将链表换成数组做简单的循环和递归测试(1)循环实现(2)递归实现

    2021年12月19日
  • springboot+Vue_从零搭建springboot项目

    springboot+Vue_从零搭建springboot项目Hello,你好呀,我是灰小猿,一个超会写bug的程序猿!利用国庆期间做了一个基于springboot+vue的前后端分离的个人博客网站,今天在这里将开发过程和大家分享一下,手把手教你搭建一个自己专属的个人博客。完整源码放置在Gitee上了,【源码链接】小伙伴们记得⭐star⭐哟!小伙伴们一键三连➕关注!灰小猿带你上高速啦????????????!先看一下博客网站的演示视频:⚡项目目录⚡个人博客网站项目整体思路Java后端接口开发(1)数据库设计​(2)整合My

  • Nginx+DNS负载均衡「建议收藏」

    Nginx+DNS负载均衡「建议收藏」今天看了很多关于nginx负载均衡的博客,人家推荐的都是自己的ip来做负载,但是同样有说DNS负载均衡,刚开始我也是一头雾水,慢慢的分析才知道真正意义上的Nginx+DNS负载均衡。1.nginx负载均衡的5种策略(先了解这个后面的才好懂)轮询策略(默认)这种策略下每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。upstreambackserver{server192.168.0.14;server192.168.0.15;}指定

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号