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

本节必须掌握的知识点:

  示例十一

   代码分析

   汇编解析

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

 注意

  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 <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语言》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java 基础学习1

目录 一.注释 二.关键字 三.字面量 四.变量和标识符 五.键盘录入 六.运算符 一.注释 1.单行注释&#xff1a;//注释信息 2.多行注释&#xff1a;/* 注释信息*/ 3.文档注释&#xff1a;/** 注释信息*/ 注:文档注释暂时用不上 二.关键字 关键字: 被Java赋予了特定…

AcWing 1015.摘花生(DP路线问题)(图解)

[路线问题] Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所…

obsidian阅读pdf和文献——与zotero连用

参考&#xff1a; 【基于Obsidian的pdf阅读、标注&#xff0c;构建笔记思维导图&#xff0c;实现笔记标签化、碎片化&#xff0c;便于检索和跳转】 工作流&#xff1a;如何在Obsidian中阅读PDF - Eleven的文章 - 知乎 https://zhuanlan.zhihu.com/p/409627700 操作步骤 基于O…

简单了解AJAX

文章目录 1、什么是AJAX2、AJAX快速入门3、Axios异步框架3.1、Axios 快速入门3.2、Axios 请求方式别名 1、什么是AJAX 概念&#xff1a;AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通…

2024獬豸杯完整Writeup

文章目录 手机手机基本信息- 1、IOS手机备份包是什么时候开始备份的。&#xff08;标准格式&#xff1a;2024-01-20.12:12:12)手机基本信息- 2、请分析&#xff0c;该手机共下载了几款即时通讯工具。&#xff08;标准格式&#xff1a;阿拉伯数字&#xff09;手机基本信息- 3、手…

go 实现暴力破解数独

一切罪恶的来源是昨晚睡前玩了一把数独&#xff0c;找虐的选了个最难的模式&#xff0c;做了一个多小时才做完&#xff0c;然后就睡不着了..........程序员不能受这委屈&#xff0c;今天咋样也得把这玩意儿破解了 破解思路&#xff08;暴力破解加深度遍历&#xff09; 把数独…

【NodeJS JS】动态加载字体的各方式及注意事项;

首先加载字体这个需求基本只存在于非系统字体&#xff0c;系统已有字体不需要加载即可直接使用&#xff1b; 方案1&#xff1a;创建 style 标签&#xff0c;写入 font-face{font-family: xxx;src: url(xxx)} 等相关字体样式&#xff1b;将style标签添加到body里&#xff1b;方…

2024017期传足14场胜负前瞻

2024017期赛事由亚洲杯2场、英总杯2场、德甲2场、意甲4场、西甲4场组成。售止时间为1月28日&#xff08;周日&#xff09;19点00分&#xff0c;敬请留意&#xff1a; 本期深盘场次同样适中&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率6场&#xff0c;其他场次基本皆是平…

武汉大学齐民友教授简介

齐民友&#xff08;1930年2月—2021年8月8日&#xff09;&#xff0c;男&#xff0c;出生于安徽省芜湖市&#xff0c;中国共产党优秀党员&#xff0c;数学家、教育家、偏微分方程专家&#xff0c;武汉大学原校长、数学与统计学院教授、博士生导师 。 齐民友于1948年考入武汉大…

(南京观海微电子)——OLED驱动与调试

一、OLED DDIC分类 OLED DDIC的技术方向可以分为3类&#xff1a;带Ram【内存】的IC、Ram-less IC和TDDI【显示&触控集成的IC】 1、带Ram的OLED DDIC OLED DDIC有两个Ram&#xff0c;分别是Demura Ram和Display Ram。 1、带Ram的OLED DDIC 1-1&#xff09;Demura Ram&a…

课时6:编程语言逻辑

1.2.2 编程语言逻辑 学习目标 这一节&#xff0c;我们从 语言分类、编程逻辑、小结 三个方面来学习。 语言分类 语言分类 低级编程语言&#xff1a;机器&#xff1a;- 二进制的0和1的序列&#xff0c;称为机器指令。- 一般人看不懂汇编&#xff1a;- 用一些助记符号替代机…

Linux ---- Shell编程之函数与数组

目录 一、函数 1、函数的基本格式 2、查看函数列表 3、删除函数 4、函数的传参数 5、函数返回值 实验&#xff1a; 1.判断输入的ip地址正确与否 2. 判断是否为管理员用户登录 6、函数变量的作用范围 7、函数递归&#xff08;重要、难点&#xff09; 实验&#xff1…

山西电力市场日前价格预测【2024-01-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-28&#xff09;山西电力市场全天平均日前电价为280.26元/MWh。其中&#xff0c;最高日前电价为556.88元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

智能分析网关V4智慧机房:视频AI智能安全监管方案

一、背景分析 随着互联网的迅猛发展&#xff0c;机房及其配套设施的数量持续攀升&#xff0c;它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石&#xff0c;机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营&#xff0c;同时也直…

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart

每次提交代码时&#xff0c;AS这个老妈子总爱唠叨一堆warning&#xff0c;这些Warning都在讲什么&#xff1f; 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中&#xff0c;android:drawableStart和app:drawableStartCompat是两个用于设置…

Java多线程基础-18:线程安全的集合类与ConcurrentHashMap

Java标准库提供了很多集合类&#xff0c;但有一些集合类是线程不安全的&#xff0c;也就是说&#xff0c;在多线程环境下可能会出问题的。常用的ArrayList&#xff0c;LinkedList&#xff0c;HashMap&#xff0c;PriorityQueue等都是线程不安全的&#xff08;Vector, Stack, Ha…

【C语言/数据结构】排序(选择排序,推排序,冒泡排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 选择排序 选择排序 ​编辑…

【开源】基于JAVA语言的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣&#xff0c;这是因为每个女人在每年&#xff0c;都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的&#xff0c;从零基础学习到店铺经营都有涉及&#xff0c;就做美睫和睫毛嫁接这两项业务&#xff0c;月收入万元以上应该问题不…

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包&#xff1a; sudo apt update查看可用软件包&#xff1a; sudo apt search mysql-server安装最新版本&#xff1a; sudo apt install -y mysql-server或者&#xff0c;安装指定版本&#xff1a; sudo apt inst…