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("请输入第一个数:\n");
int r =scanf("%d",&number1);
//查看Scanf是否收到了正确的数
if(r==){
printf("别调皮,这样不好玩,我走了\n");
//程序退出
return ;
}
// 何问起 hovertree.com
//提示用户输入第二个数
printf("请输入第二个数:\n");
r = scanf("%d",&number2);
if(r==){
printf("别调皮,这样不好玩,我走了\n");
//程序退出
return ;
} //提示用户输入运算符
printf("请输入运算符(%d%d%d%d分别对应加减乘除):\n",JIA,JIAN,CHENG,CHU);
r = scanf("%d",&opt);
if(r==){
printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 我走了\n");
//程序退出
return ;
} //程序运行到这里说明两次输入都正确
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 ;
}
宏名习惯性全部大写,定义宏不需要分号结束。宏的实质就是替换。在编译时,第一步就是把代码中的宏用实际的值代替。用宏还一个好处,当你把宏对值改动的话,程序其余地方不用动。比如你可以把1234,改成0123,程序照样运行不出错。
枚举
但是,除了宏之外,还可以使用枚举。如是:
enum OPT{
jia = ,
jian,
cheng,
chu
}; int main(void)
{
//保存用户输入的数
int number1;
int number2;
int opt;//运算符 //提示用户输入第一个数:
printf("请输入第一个数:\n");
int r =scanf("%d",&number1);
//查看Scanf是否收到了正确的数
if(r==){
printf("别调皮,这样不好玩,我走了\n");
//程序退出
return ;
} //提示用户输入第二个数
printf("请输入第二个数:\n");
r = scanf("%d",&number2);
if(r==){
printf("别调皮,这样不好玩,我走了\n");
//程序退出
return ;
} //提示用户输入运算符
printf("请输入运算符(%d%d%d%d分别对应加减乘除):\n",jia,jian,cheng,chu);
r = scanf("%d",&opt);
if(r==){
printf("运算符也是数字,别搞错好吗?你这样让我怎么混? 我走了\n");
//程序退出
return ;
}
// 何问起 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 ;
}
枚举有名字,我们这个枚举叫OPT。枚举虽然看起来像结构,但是枚举与结构完全不是一回事。枚举的每一项就是为一个整数取了个名字,每一项都是一个常量,而不是的成员变量。枚举的用处更像是把表示某种东西的相关值组织到一起,而宏就做不到了。比如四则运算的宏,每一项都可以随意找位置放,它们不紧邻也没有语法错误。而枚举是强制把相关的项放在一起。
枚举的项的名字一般不大写,当然你可以像宏一样大写。只要你整个工程中都能坚持统一的风格就行了。
http://www.cnblogs.com/roucheng/p/cpp11.html
C++宏和枚举的更多相关文章
- 枚举宏(Adopting Modern Objective-C)
使用NS_ENUM 和 NS_OPTIONS宏定义枚举.Adopting Modern Objective-C 使用NS_ENUM宏定义一组互斥的枚举值: typedef NS_ENUM(NSInte ...
- DELPHI设置枚举类型size
delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难. 经过查找资料,原来delphi可以通过{$Z+} {$ ...
- NS_ENUM和NS_OPTIONS宏
枚举的宏定义 一.简介 NS_ENUM和NS_OPTIONS宏提供了一种简明.简单的方法来定义基于C语言的枚举和选项. 这些宏提高了Xcode中的代码完成性,并明确指定了枚举和选项的类型和大小. 此 ...
- vim+vundle配置
Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用.一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能.一般流程都是下载需要的工具,然 ...
- Google C++命名规范
时间:2014.03.02 地点:基地 -------------------------------------------------------------------------------- ...
- vim + ctags + taglist配置和使用
vim +ctags + taglist ,ctags+cscope 安装配置和使用 内容:VIM下ctags和taglist的安装配置方法:一键安装 ctags和cscope的方法 :vim语法高亮 ...
- Objective-C开发编码规范【转载】
概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序.关于Objective-C的编码规范,苹果和谷歌都已经有很好的总结: Apple Coding Guide ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...
- Scope 安装和使用
Scope 安装和使用 一.安装 1. 软件下载 https://sourceforge.net/projects/cscope/files/ 2. 解压 3. 安装 ./configure --pr ...
随机推荐
- 使用后台服务数据更新UI
https://www.websmithing.com/2011/02/01/how-to-update-the-ui-in-an-android-activity-using-data-from-a ...
- UStore-自定义JDF文件格式输出
系统默认的JDF输出不能满足我们的需求,往往不同的供应商输出不同要求的JDF格式.这里我们开始介绍ustore的自定义JDF输出 1.先屏蔽掉默认的JDF格式输出 我们进入Tigger来设置ustro ...
- 基于Vue封装分页组件
使用Vue做双向绑定的时候,可能经常会用到分页功能 接下来我们来封装一个分页组件 先定义样式文件 pagination.css ul, li { margin: 0px; padding: 0px;} ...
- MVVM架构~knockoutjs系列之扩展ajax验证~验证数据是否存在
返回目录 在大部分网站里,用户名都是唯一的,即当用户注册时,如果用户输入的名字不合法,我们需要提示用户,让用户再起个新名字,而这种复杂的验证一般是通过JS来实现的,如果把它集成到ko里,那就完美了.有 ...
- 知方可补不足~sqlserver中使用sp_who查看sql的进程
回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...
- Java程序员的日常 —— Java类加载中的顺序
之前说过Java中类的加载顺序,这次看完继承部分,就结合继承再来说说类的加载顺序. 继承的加载顺序 由于static块会在首次加载类的时候执行,因此下面的例子就是用static块来测试类的加载顺序. ...
- jQuery监听文本框值改变触发事件(propertychange)
完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- gulp/grunt和browserify/webpack的区别
Gulp应该和Grunt比较,他们的区别我就不说了,说说用处吧.Gulp / Grunt 是一种工具,能够优化前端工作流程.比如自动刷新页面.combo.压缩css.js.编译less等等.简单来说, ...
- 快速入门系列--GIT版本控制工具
由于GIT刚刚开始使用不久,经常会在Merge时出现没有change-id的情况,在结合gerrit使用时,经常出现不能提交的情形,使得自己很困扰.最近有次熬夜加班,在代码完成后,由于多人在很短时间内 ...
- CSS3伸缩布局Flex学习笔记
如果需要使用伸缩布局首先得把display:flex;对于兼容还得加前缀display:-webkit-display:flex;等其他浏览器前缀,但我本机Chrome测试已经不需要加前缀了,其实这些 ...