switch case后接枚举(用于判断字符串常量)

c/c++ 语言不允许后面直接接字符串。
c/c++ 语言case后面只允是整型、常量或表达式,例如:
int k=3;
switch(k)
{
    case 'd'-'a':  
        printf("d-a\n");
        break;
    case 4 :       
        printf("4\n");
        break;
    case 'Z' :     
        printf("Z\n");
        break;  //单引号括起的是字符常量,是整型。
}
上面用的都是整型常量表达式,所以正确。
字符串常量,例如:双引号括起的 "Z", 虽然是常量,但它们不是整型,所以不允许。
其它语言,要看它们自己的规定。

我们可以利用结构体及枚举,使switch case可以用来判断字符串常量

typedef enum {
    oBadOption,
    oDaemon,
    oDebugLevel,
    oExternalInterface,
} OpCodes;

static const struct {
    const char *name;
    OpCodes opcode;
} keywords[] = {
    { "daemon",                 oDaemon },
    { "debuglevel",             oDebugLevel },
    { "externalinterface",      oExternalInterface },
    { NULL,                oBadOption },
};


static OpCodes config_parse_token(const char *cp)
{
    int i;

    for (i = 0; keywords[i].name; i++)
        if (strcasecmp(cp, keywords[i].name) == 0)
            return keywords[i].opcode;

    debug(LOG_ERR, "Bad configuration option is NULL");
    return oBadOption;
}

int opcode = config_parse_token("daemon");
switch(opcode)
{
    case oDaemon:
        if (config.daemon == -1 && ((value = parse_boolean_value(p1)) != -1))
        {
            config.daemon = value;
        }
            break;
    case oExternalInterface:
        config.external_interface = safe_strdup(p1);
        break;
    case oGatewayID:
        config.gw_id = safe_strdup(p1);
        break;
    case oBadOption:
        debug(LOG_ERR, "Exiting...");
        break;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。 enum Signal { GREEN, YELLOW, RED } public class TrafficLight { Signal color = Signal.RED; public void change() { switch (color) { case RED: color = Signal.GREEN; break ; case YELLOW: color = Signal.RED; break ; case GREEN: color = Signal.YELLOW; break ; } } } 用法三:向枚举中添加新方法 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum实例。 public enum Color { RED("红色" , 1 ), GREEN( "绿色" , 2 ), BLANK( "白色" , 3 ), YELLO( "黄色" , 4 ); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this .name = name; this .index = index; } // 普通方法 public static String getName( int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null ; } // get set 方法 public String getName() { return name; } public void setName(String name) { this .name = name; } public int getIndex() { return index; } public void setIndex( int index) { this .index = index; } } 用法四:覆盖枚举的方法 下面给出一个toString()方法覆盖的例子。 public enum Color { RED("红色" , 1 ), GREEN( "绿色" , 2 ), BLANK( "白色" , 3 ), YELLO( "黄色" , 4 ); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this .name = name; this .index = index; } //覆盖方法 @Override public String toString() { return this .index+ "_" + this .name; } } 用法五:实现接口 所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。 public interface Behaviour { void print(); String getInfo(); } public enum Color implements Behaviour{ RED("红色" , 1 ), GREEN( "绿色" , 2 ), BLANK( "白色" , 3 ), YELLO( "黄色" , 4 ); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this .name = name; this .index = index; } //接口方法 @Override public String getInfo() { return this .name; } //接口方法 @Override public void print() { System.out.println(this .index+ ":" + this .name); } } 用法六:使用接口组织枚举 public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值