C语言学习笔记(浙大翁恺版)第十一周 结构(1)

目录

11.1.1 枚举

 常量符号化

枚举

小套路:自动计数的枚举

枚举量


11.1.1 枚举

 常量符号化

在程序中我们经常避免直接出现数字,用具体的单词或者别的能表达意思的字符串代替,这样可以大幅提升可读性。

比如用单词代替数字

#include <stdio.h>
const int red = 0;
const int yellow = 1;
const int green = 2;

int main(int argc, char const *argv[])
{
    int color = -1;
    char *colorName = NULL;
    printf("输入你喜欢的颜色的代码: "); 
    scanf ("%d", &color);
    switch ( color ) {
        case red: colorName = "red"; break;
        case yellow: colorName = "yellow"; break;
        case green: coLorName = "green"; break;
        default: colorName= "unknown"; break;
}
    printf("你喜欢的颜色是%s\n", colorName);
    return 0;
}

现在我们有一种更加方便的方式来存放罗列起来的数据,即枚举

枚举

#include <stdio.h>
//定义一个名为color的枚举
enum COLOR {RED,YELLOW,GREEN};

int main(int argc, char const *argv[])
{
    int color = -1;
    char *colorName = NULL;

    printf("输入你喜欢的颜色的代码: "); 
    scanf ("%d", &color);
    switch ( color ) {
        case RED: colorName = "red"; break;
        case YELLOW: colorName = "yellow"; break;
        case GREEN: coLorName = "green"; break;
        default: colorName= "unknown"; break;
}
    printf("你喜欢的颜色是%s\n", colorName);

    return 0;
}

这种方式要比const int定义更加方便

  • 枚举是一种用户定义的数据类型,它用关键字enum来声明,定义枚举是给一些常量赋名:
    • enum 枚举名 {名字0,名字1,...,名字n};
    • 使用时大多会将枚举名省去,因为它并不真的使用,括号内的名字才更加重要。
    • 括号内实际上是常量符号,类型是int,值依次从0到n递增

以一个程序来说明其特性:

#include <stdio. h>
enum color { red, yellow, green};

//枚举类型要跟上enum,无论是函数的参数表里还是变量里(C语言中规定)
void f(enum color c);


int main(void)
{
//枚举量可以作为值
    enum color t = red;

//实际上,red就是0,C语言内部以整数来处理它
    scanf("%d", &t);
    f(t);
    return 0;
}
void f(enum color c)
{
    printf("%d\n",c);
}

小套路:自动计数的枚举

枚举内部计数规则和数组一样,从0开始计数,因此如果在元素最后加一个名字,这个名字代表的数字就是前面名字的计数量。比如

  • enum color { red, yellow, green,NumColors};NumColors代表3,前面正好3个元素

此时如果需要遍历所有枚举量、或者需要建立用枚举量做下标的数组时,就可以轻松得知枚举量的个数。 

#include <stdio.h>
enum COLOR {RED,YELLOW, GREEN, NumCOLORS};

int main(int argc, char const *argv[])
{
    int color = -1;
//可以用NumColors建立数组
    char *ColorNames [NumCOLORS] = {
    "red", "yellow", "green",
    };
    char *colorName = NULL;

    printf("输入你喜欢的颜色的代码: ");
    scanf("%d", &color);
//可以用NumColors作为判断依据
    if ( color >=0 && color < NumCOLORS ) {
    colorName = ColorNames [color] ;
    } else {
    colorName= "unknown" ;
    }

    printf ("你喜欢的颜色是%s\n",colorName);
    return 0;
}

枚举量

  • 在声明枚举量的时候可以不按默认原则,自定义值
enum COLOR {RED=1,YELLOW, GREEN=5 };
//此时yellow=2
  • 枚举量只是int类型(但是给枚举量赋超过int的整数也不会报错,或者0)
  • 虽然枚举类型可以当成类型使用,但不好用。。。
  • 意义上有排比的名字,用枚举比const int方便,不用一行一行写
  • 枚举比宏(macro)好,因为枚举有int类型,宏没有类型
  • 枚举的主要用途就是拿来定义一些符号量,而不是当一种类型

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值