本节必须掌握的知识点:
示例十一
代码分析
汇编解析
3.6.1 示例十一
enum定义枚举类型,它本质是一种整数类型(等同int)。所谓枚举就是一一列举的意思。在实际应用中,一个星期有七天,一年有十二个月等。如果我们把一个星期的天数一一列举出来,就可以用enum枚举类型列举。我们先看enum枚举类型定义的格式:
枚举的定义枚举类型定义的格式:
enum 枚举名{ 枚举值表 };
例:一星期有7天也就是有7种可能的值,请用枚举类型写出这7种可能。
示例代码十一
/*
使用枚举类型表示周一到周日
*/
#include <stdio.h>
#include <stdlib.h>
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
注意
- 命名和变量的命名规则一样;
- 大括号末尾要用分号;
- 各项之间要用逗号隔开,最后一个不需要加逗号;
- 如果不给枚举值赋初始值,系统默认从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 <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
//函数定义
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,要求输入人物力量、计算出人物攻击力。
本文摘自编程达人系列教材《汇编的角度——C语言》。