enum在c语言中怎么用
发布网友
发布时间:2022-04-28 13:58
我来回答
共6个回答
懂视网
时间:2022-04-15 05:12
在Android的API中可以发现有很多用整数集来作为参数的地方,先来看一下实例。 LinearLayout是大家所熟知的一个UI基本元素,它里面有一个方向的属性,可以通过以下方法来设置: LinearLayout.setOrientation(int); 使用的时候,通常都是这样: LinearLayout.s
在Android的API中可以发现有很多用整数集来作为参数的地方,先来看一下实例。
LinearLayout是大家所熟知的一个UI基本元素,它里面有一个方向的属性,可以通过以下方法来设置:
LinearLayout.setOrientation(int);
使用的时候,通常都是这样:
LinearLayout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.setOrientation(LinearLayout.VERTICAL);
但也可以这样使用:
LinearLayout.setOrientation(0); // LinearLayout.HORIZONTAL = 0
LinearLayout.setOrientation(1); // LinearLayout.VERTICAL = 0x01
甚至可以这样:
LinearLayout.setOrientation(Integer.MAX_VALUE);
LinearLayout.setOrientation(Integer.MIN_VALUE);
LinearLayout.setOrientation(2012);
因为方法setOrientation接收的参数是一个整数,所以你可以传任意合法的整数---至少这在编译时不会有任何问题。它只会在运行时可能引发问题,但如你所知,开发者只关注程序能否编译成功,至于运行时,那是用户关心的事儿,因为开发者不一定使用他们所开发出的程序。
除了这个例子,在Android的API中到处可以看到这种API,比如设置View的可见性,设置Wifi状态等等。都是定义了整数集,然后用整数来做为参数,并寄希望开发者能传递整数集中定义的常量来作为参数。但如你所知,并不是每个人都那么的守规矩,如果每个人都能遵守规则,这个世界就真的和谐了,蛋扯远了。
因为开发者通常只能关注编译,所以如果能把这个规则应用在编译时,那么就会大大减少出错的可能。有兴趣的朋友可以去试试看,给这些接收整数参数的方法传一些“平常”的数值,比如2012,Integer.MAX_VALUE,Integer.MIN_VALUE等等,看会出现什么状况。
另外,如果开发者传递与常量定义一致的整数值,虽然编译运行都不会有错,但代码的可读性会大大的降低,比如:
LinearLayout.setOrientation(0);
LinearLayout.setOrientation(1);
这完全没有错,但是代码的阅读者和维护者通常都会蛋疼的。
当然,Android自身还是有保护措施的,如果对API传递不合法参数,不会造成其他影响,只是设置不能生效,但API会使用默认值,因为对于每个内置参数,都有相应的默认值。如LinearLayout的orientation,默认值就是LinearLayout.HORIZONTAL,所以如果对setOrientation()传入非法值,LinearLayout会保持水平排列,无其他影响。后面有个对Linearlayout的orientation做的试验。
另外,如果在Layout XML文件中设置这些属性就不会有些问题,如:
因为XML布局会在编译时被处理,如果有非法的值,会有编译错误的。我想这也就是Android特别鼓励开发者用XML来制作所有的布局的一个原因吧。
实例,三个没有设置指向的线性布局,默认是水平放置,在代码中设置了几个离谱的值,发现它们还是水平的,也就是说设置离谱的值不会出错,但也不起作用:
运行结果如下:
代码如下:
和:
package com.android.explorer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
public class LinearLayoutTest extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.linearlayout_test);
LinearLayout one = (LinearLayout) findViewById(R.id.linearlayout_test_1);
one.setOrientation(2012);
LinearLayout two = (LinearLayout) findViewById(R.id.linearlayout_test_2);
two.setOrientation(Integer.MAX_VALUE);
LinearLayout three = (LinearLayout) findViewById(R.id.linearlayout_test_3);
three.setOrientation(Integer.MIN_VALUE);
}
}
用Enum代替整数集
其实很简单,用Enum(枚举)就可以很方便的解决这个问题,使用起来也不比定义整数集繁琐,同样的可读。另外的优点就是,它的封装更好,最重要的是它会在编译时被检查。因为Java是一种Strong Type,也就是说在编译时,编译器会对所有原型类型和参数类型进行检查,如果类型不对,并且没有强制转型的,就会报出编译错误,当然编译器所支持的自动转型除外。比如一个需要int,而传的参数是long,虽然都差不多,没有溢出等,但还是会有编译错误。
所以,如果LinearLayout使用Enum,就像这样定义:
public class LinearLayout extends ViewGroup {
private Orientation mOrientation;
public enum Orientation {
HORIZONTAL, VERTICAL
};
public void setOrientation(Orientation dir) {
mOrientation = dir;
}
}
然后这样使用:
import android.widget.LinearLayout;
LinearLayout.setOrientation(Orientation.HORIZONTAL);
LinearLayout.setOrientation(Orientation.VERTICAL);
那么,开发者就不会用错了,因为首先,它看到setOrientation所需要的参数是一个Orientation的枚举类型,就会自然的传送Orientation中定义的类型;另外,如果传其他的值,比如0或者1,编译器也不会答应的。
可悲的是Android中几乎所有的API都是以整数集的方式来定义的,所以就要时刻提醒自己和组里的人,一定要传所定义的整数集中的常量。
那么我们能做的,除了要传整数集中定义的常量,对于那些以整数集方式定义的API,以外。更重要的是当自己定义接口的时候,尽量用Enum而不要使用整数集。
还有一点需要注意的是,对于某些弱类型语言,也就是说在编译时不会对类型做特别细致的检查,比如C++,C等,那么即使使用了Enum,也不一定安全,因为对于C++和C来讲Enum中的常量与整数常量完全一样,连编译器都分不清。所以,对于这类语言,只能寄希望于开发者了。
后记:
写完这篇,让我想起了另外一些与参数定义相关的问题,比如布尔型参数也不是一个很好的设计,因为使用者很难到底应该传True还是传False,特别是当方法名字不能体现Boolean参数作用时和文档不够清楚的时候。如果只有一个参数还好,根据方法名字和常识都能知道,比如:
Button.setEnabled(true); // enable the button
Button.setEnabled(false); // disable the button
但对于某些情况,当方法的名字不能体现Boolean参数的作用时,或是多于一个参数时,而方法的主要目的又不能体现Boolean参数的作用时,就很不清楚,比如:
// com/android/mms/data/ContactList.java
public String[] getNumbers(boolean);
您能猜出来这个boolean变量是决定是否要为彩信对联系人做特殊的处理吗?您在使用这个API的时候能很快知道该传True还是该传False吗?当读到这些语句的时候:
String[] mms = getNumbers(true);
String[] sms = getNumbers(false);
您能知道True和False的含义与作用吗?至少我看到这样的代码时,如果不去跟踪它的实现,是猜不出来的。
但现实的问题是,API通常又需要从调用者那里得到做还是不做的决定。一个可行的途径是用方法来封装和隐藏,比如:
Button.setEnabled(true); // enable the button
Button.setEnabled(false); // disable the button
可以改成:
Button.enable();
Button.disable();
这是简单的情况,对于稍复杂的情况,比如后一个例子,可以添加另外的接口,而不是用重载方法,但内部的实现,可能还是需要重载,但是这就把问题缩小了,起码对使用者来说是隐藏的:
// com/android/mms/data/ContactList.java
public String[] getNumbersForSms();
public String[] getNumbersForMms();
这样一来,对外来讲就是良好的封装。内部实现可能还是需要一个类似这样的私有方法:
// com/android/mms/data/ContactList.java
public String[] getNumbersForSms() {
return getNumbers(false);
}
public String[] getNumbersForMms() {
return getNumbers(true);
}
private String[] getNumbers(boolean) {
// implementation
}
但至少把问题缩小化了,也可以加上注释来说明。就不必导致使用者来猜方法的用法和含义了。
对于使用Boolean作为参数的弊端,可以参考陈皓的这篇博客,讲的很透彻。
热心网友
时间:2022-04-15 02:20
11.10 枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
11.10.1 枚举类型的定义和枚举变量的说明
1. 枚举的定义枚举类型定义的一般形式为:
enum 枚举名{ 枚举值表 };
在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
例如:
该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。
2. 枚举变量的说明
如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。
设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:
enum weekday{ sun,mou,tue,wed,thu,fri,sat };
enum weekday a,b,c;
或者为:
enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者为:
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
11.10.2 枚举类型变量的赋值和使用
枚举类型在使用中有以下规定:
1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
例如对枚举weekday的元素再作以下赋值:
sun=5;
mon=2;
sun=mon;
都是错误的。
2. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。
【例11.10】
main(){
enum weekday
{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
a=sun;
b=mon;
c=tue;
printf("%d,%d,%d",a,b,c);
}
说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
a=sum;
b=mon;
是正确的。而:
a=0;
b=1;
是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如:
a=(enum weekday)2;
其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:
a=tue;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
【例11.11】
main(){
enum body
{ a,b,c,d } month[31],j;
int i;
j=a;
for(i=1;i<=30;i++){
month[i]=j;
j++;
if (j>d) j=a;
}
for(i=1;i<=30;i++){
switch(month[i])
{
case a:printf(" %2d %c\t",i,'a'); break;
case b:printf(" %2d %c\t",i,'b'); break;
case c:printf(" %2d %c\t",i,'c'); break;
case d:printf(" %2d %c\t",i,'d'); break;
default:break;
}
}
printf("\n");
}
热心网友
时间:2022-04-15 03:38
enum是枚举变量
一般的定义方式如下:
enum enum_type_name
{
ENUM_CONST_1,
ENUM_CONST_2,
...
ENUM_CONST_n
} enum_variable_name;
注意:enum_type_name 是自定义的一种数据数据类型名,而enum_variable_name 为enum_type_name类型的一个变量,也就是我们平时常说的枚举变量。实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量enum_variable_name 只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。
enum 变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0 开始依次递增1。如分别用一个常数表示不同颜色:
enum Color
{
GREEN = 1,
RED,
BLUE,
GREEN_RED = 10,
GREEN_BLUE
}ColorVal;
其中各常量名代表的数值分别为:
GREEN = 1
RED = 2
BLUE = 3
GREEN_RED = 10
GREEN_BLUE = 11
在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
热心网友
时间:2022-04-15 05:12
C语言的枚举类型实质就是整型变量,只不过通过枚举类型将一类有关联的标识组合起来,增加程序的可读性和可维护性
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(5) 枚举型是预处理指令#define的替代。
(6) 类型定义以分号;结束。
定义枚举类型
enum YOURENUMTYPE
{
ID1,//如果不额外指定则第一个标识等于整数0,后续依次加1
ID2,
ID3=7,
....
IDn//最后一个标识符后面没有逗号
};//注意一定要加上这个分号
定义枚举变量
enum YOURENUMTYPE varname;
给枚举变量赋值 varname = IDx;
举个完整的例子
enum FRUIT
{
APPLE,
PEAR,
ORANGE,
PEACH,
GRAPE,
BANANA
};
enmu FRUIT myfruit = PEACH;
热心网友
时间:2022-04-15 07:04
举个例子 学生 类分大学生 高中 初中小学生
你就可以这么做
enum student{colleage,high,middle,junior}
//小明是个大学生
student xiaoming=colleage;
//判断小刚是不是高中生
if(xiaogang==high)
热心网友
时间:2022-04-15 09:28
参考:
http://www.pconline.com.cn/pce/empolder/gj/c/0502/562347.html
参考资料:http://www.pconline.com.cn/pce/empolder/gj/c/0502/562347.html
enum在c语言中是什么意思?
在C语言中,enum是一个关键字,用于定义枚举类型。枚举类型是一种数据类型,它允许用户为整数值定义一组命名的常量。这些常量代表某些特定的整数值,使得代码更易读和维护。2. 枚举的具体使用 通过enum定义的枚举类型,可以包含多个枚举值。这些值在定义时会被分配一个整数值,通常从0开始,但也可以手动...
enum在c语言中是什么意思?
在C语言中,enum是一个关键字,用于定义枚举类型。枚举类型是一种数据类型,它允许用户为整数值定义命名的常量集合。这些常量通常表示某些固定的、预定义的整数值。使用枚举类型可以增加代码的可读性和可维护性。2. 枚举类型的用法 通过enum定义的枚举类型包含一组命名的常量值。每个值代表一个整数,默认从...
c语言enum是什么意思
在C语言中,enum用于定义枚举类型。枚举类型是一种用户定义的类型,它允许你为整数值分配有意义的名称,这些名称称为枚举常量。这样,你就可以使用这些有意义的名称而不是普通的整数来表示某些特定的值。二、具体用法 枚举的定义通常包含在一对花括号{}内,每个枚举成员后跟一个分号。例如:c enum Weekda...
enum在c语言中怎么用?
2. 枚举类型以enum开头,后跟一个可选的类型名,例如enum DAY。类型名可以看作是枚举集合的标签,它不是必须的,但通常为了代码的清晰和可维护性而使用。3. 枚举成员可以显式地为某个整数值进行赋值,如果未赋值,则默认按照它们在枚举声明中的顺序,从0开始依次递增。4. 枚举提供了一种比预处理器...
enum在c语言中怎么用 (枚举型)
varname = IDx;举个完整的例子enum FRUIT{APPLE,PEAR,ORANGE,PEACH,GRAPE,BANANA};enmu FRUIT myfruit = PEACH;1举个例子: 学生 类分大学生 高中 初中小学生你就可以这么做enum student{colleage,high,middle,junior}//小明是个大学生student xiaoming=colleage;//判断小刚是不是高中生 ...
枚举类型enum用法
枚举类型enum的用法如下文所示:枚举enum就是英文enumerate的缩写,也就是呢列举、排列说明的意思。枚举类型是C语言中的一种特殊类型,枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围。定义枚举类型:enum 枚举类型 {枚举值列表};1、定义枚举类型 2、如果在定义枚举类型时指定元素的值,也...
c语言enum用法
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在...
C语言——枚举enum
C语言中的枚举enum是一种强大的工具,它为一组离散值提供了一种明确而简洁的表示方式,提升代码可读性。要创建枚举,首先使用关键字enum,接着指定一个唯一的名字,再用大括号包含一系列的常量,每个常量可以用标识符标识,也可赋予整数值。如果没有指定,系统会自动生成从0开始的递增序列。枚举的语法...
c语言枚举类型enum用法
c语言枚举类型enum用法如下:(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。(2)DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。在当前值没...
c语言枚举类型enum用法
C语言中的枚举类型(enum)用法详解:1. 枚举类型是一组命名的整型常量,这些常量构成了一个集合。集合中的元素(枚举成员)通过逗号分隔。2. `DAY`是一个自定义的标识符,用作枚举集合的名称,这一点是可选的。3. 枚举成员的值从0开始,后续成员的值自动递增。如果未显式赋值,每个成员的值将默认...