【新书推荐】3.6 enum枚举类型

本节必须掌握的知识点:

  示例十一

   代码分析

   汇编解析

3.6.1 示例十一

enum定义枚举类型,它本质是一种整数类型(等同int)。所谓枚举就是一一列举的意思。在实际应用中,一个星期有七天,一年有十二个月等。如果我们把一个星期的天数一一列举出来,就可以用enum枚举类型列举。我们先看enum枚举类型定义的格式:

枚举的定义枚举类型定义的格式:

enum 枚举名{ 枚举值表 };

例:一星期有7天也就是有7种可能的值,请用枚举类型写出这7种可能。

示例代码十一

/*

   使用枚举类型表示周一到周日

*/

#include

#include

enum Weekday    //定义enum枚举类型

{

    Sunday,

    Monday,

    Tuesday,

    Wendesday,

    Thursday,

    Friday,

    Saturday

}a, b, c;   //定义枚举变量,相当于enum Weekday a;enum Weekday b;enum Weekday c;

int main(void) {

    /*也可以在这里定义枚举变量

enum Weekday a;// enum Weekday枚举变量名

enum Weekday b;

enum Weekday c;

*/

a = Sunday; //枚举变量赋值

    b = Tuesday;

    c = Friday;

    printf("%d,%d,%d\n", a, b, c);

    system("pause");

    return 0;

}

●输出结果:

0,2,5

请按任意键继续. . .

3.6.2 代码分析

Enum关键词做了三件事:

1.定义了一个新的类型Weekday(整型);

2.定义了7个字面常量:

Sunday:0,Monday:1,Tuesday:2, Wendesday:3,Thursday:4,Friday:5,Saturday:6;

枚举类型默认从整数0开始递增,也可以修改每个枚举符号的初始值。例如:

Sunday:0,Monday:3,Tuesday:4, Wendesday:7,Thursday:8,Friday:9,Saturday:10;

3.给新的类型enum Weekday 定义了三个变量,依次为a、b、c。

主函数main里面是给三个枚举类型变量赋值,并以十进制打印出三个变量的值。

如果不使用枚举类型,而是使用#define宏定义也可以实现。示例十一枚举类型的定义可以改为:

#define Sunday      0

#define Monday      1

#define Tuesday     2

#define Wendesday   3

#define Thursday    4

#define Friday      5

#define Saturday    6

 注意

  1. 命名和变量的命名规则一样;
  2. 大括号末尾要用分号;
  3. 各项之间要用逗号隔开,最后一个不需要加逗号;
  4. 如果不给枚举值赋初始值,系统默认从0开始,依次递增;

5.类型名可以不写。

3.6.3 汇编解析

       ■汇编代码

;C标准库头文件和导入库

include vcIO.inc

;枚举类型等价于常量值定义

Sunday          = -1

Monday         = 1

Tuesday         = 2

Wendesday   = 3

Thursday        = 4

Friday            = 5

Saturday        = 6

.data      

a     sdword Sunday          ;枚举类型等价于sdword类型

b     sdword Tuesday

e     sdword Friday

.const    

szMsg db "%d,%d,%d",0dh,0ah,0

.code     

start:

       invoke printf,offset szMsg,a,b,e                

       ;     

       invoke _getch

       ret                       

end start

●输出结果:

-1,2,5

       在汇编语言中,枚举类型等同于常量符号的定义语句,编译器在编译时,将表示星期的符号替换为整数值。

       ■反汇编代码

           a = Sunday;  //枚举变量赋值

00141838  mov         dword ptr [_a (014A154h)],0 

    b = Tuesday;

00141842  mov         dword ptr [_b (014A148h)],2  

    c = Friday;

0014184C  mov         dword ptr [_c (014A13Ch)],5 

    printf("%d,%d,%d\n", a, b, c);

00141856  mov         eax,dword ptr [_c (014A13Ch)] 

0014185B  push        eax 

0014185C  mov         ecx,dword ptr [_b (014A148h)] 

00141862  push        ecx 

00141863  mov         edx,dword ptr [_a (014A154h)] 

00141869  push        edx 

0014186A  push        offset string "%d,%d,%d\n" (0147B30h) 

0014186F  call        _printf (014104Bh) 

00141874  add         esp,10h 

由上述反汇编代码可知,编译器在编译3-6-1.c源代码时,将枚举符号替换为对应的整数值。Sunday替换为0, Tuesday替换为2,Friday替换为5。

实验三十四:检测数据类型

    编写代码时,经常报错,而代码错误无非就两种可能。第一种:逻辑错误;第二种:语法错误。而定义数据类型和查看数据类型数据是我们编写代码不可或缺的,这里给出一个检测数据类型的小程序。(看不懂没关系,这些知识点会在以后的章节介绍。)

VS中新建项目3-6-2.c。代码如下:

/*

  检测数据类型

*/

#include

#include

#include

#include

//函数定义

void Datatype(int i, char ch, float fl, char data_char[], int data_int[], int len, int option)

{

    int j;

    switch (option)

    {

        //输出整数

    case 1:

    {

        printf("int类型:%d\n", i);

        break;

    }

    //输出字符

    case 2:

    {

        printf("char类型:%c\n", ch);

        break;

    }

    //输出字符

    case 3:

    {

        printf("float类型:%f\n", fl);

        break;

    }

    //输出字符

    case 4:

    {

        printf("char 数组类型:  ");

        for (j = 0; j < len; j++)

        {

            printf("%c", data_char[j]);

        }

        printf("\n");

        break;

    }

    case 5:

    {

        printf("int 数组类型: ");

        for (j = 0; j < len; j++)

        {

            printf("%d", data_int[j]);

        }

        printf("\n");

        break;

    }

    default:

        printf("Error!\n");

        break;

    }

}

void main()

{

    int i, j, data_int[8];

    char ch, data_char[8];

    float fl;

    //初始化字符串

    char *str = "www.bcdaren.com";

    //初始化整形数组

    for (i = 0; i < 8; i++)

    {

        data_int[i] = i + 1;

    }

    //初始化字符串型数组

    for (j = 0; j < 8; j++)

    {

        data_char[j] = (char)(j + 65);

    }

    ch = 'x';

    fl = 6.5f;

    system("cls");//清除屏幕

    //输出整型i的值

    Datatype(i, 0, 0, 0, 0, 0, 1);

    //输出字符型ch的值

    Datatype(0, ch, 0, 0, 0, 0, 2);

    //输出浮点型fl的值

    Datatype(0, 0, fl, 0, 0, 0, 3);

    //输出a_char的值

    Datatype(0, 0, 0, data_char, 0, 8, 4);

    //输出str字符串的值

    Datatype(0, 0, 0, str, 0, 16, 4);

    //输出int 数组型a_char的值

    Datatype(0, 0, 0, 0, data_int, 8, 5);

    //default:Error!

    Datatype(0, 0, 0, 0, 0, 0, 10);

    system("pause");

}

●输出结果:

int类型:8

char类型:x

float类型:6.500000

char 数组类型:  ABCDEFGH

char 数组类型:  www.bcdaren.com

int 数组类型: 12345678

Error!

请按任意键继续. . .

练习

1、自己多练习使用本小节介绍的数据类型,这些数据类型将度过你的代码生涯。

2、使用已学的知识,在控制台输出下图的内容。

计算某游戏人物攻击力,其计算公式为:

人物攻击力 =人物力量*(装备+武器伤害)/100

现已知装备90,武器伤害97.5,要求输入人物力量、计算出人物攻击力。

【新书推荐】3.6 enum枚举类型_第1张图片

本文摘自编程达人系列教材《汇编的角度——C语言》。

你可能感兴趣的:(《汇编的角度——C语言》,汇编,c语言)