当前位置: 首页 > news >正文

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

目录

1 什么是枚举

2 定义枚举类型

2.1 语法格式

2.2 枚举元素的特点

2.3 案例演示

3 枚举变量

3.1 什么是枚举变量

3.2 定义枚举变量的多种方式

3.3 案例演示 1:标准版枚举类型

3.4 案例演示 2:简化版枚举类型

3.5 案例演示 3:匿名枚举类型

4 枚举的遍历

4.1 连续枚举常量的遍历

4.2 非连续枚举常量的遍历

4.2.1 手动遍历每个枚举常量

4.2.2 使用数组存储枚举常量

5 枚举在 switch 中使用

6 枚举数组


1 什么是枚举

        枚举(Enumeration)是 C 语言中的一种用户自定义数据类型,用于定义一组相关的常量。它允许为这些常量赋予有意义的名称,从而增强代码的可读性和可维护性。

        如果我们要定义一个变量来表示一周中的某一天,可以使用枚举类型来确保该变量的值仅限于七个预定义的有效值之中。这样能够有效地限制变量的取值范围,确保其准确性与合理性。


2 定义枚举类型

2.1 语法格式

        枚举类型使用 enum 关键字定义,通过为一组相关常量命名来创建一种新的数据类型。枚举名称(通常使用全大写表示)和其中的元素名称均为标识符(需要满足标识符的命名规则)。定义一个枚举就是定义了一种新的数据类型,其基本语法如下:

// 不指定值的枚举
enum 枚举名称 {枚举元素1,枚举元素2,...枚举元素N
};  // 分号不要忘记// 指定部分值的枚举
enum 枚举名称 {枚举元素1 = 值1,枚举元素2,...枚举元素N
};  // 分号不要忘记// 完全指定值的枚举
enum 枚举名称 {枚举元素1 = 值1,枚举元素2 = 值2,...枚举元素N = 值N
};  // 分号不要忘记

        枚举类型可以在 main 函数外面定义,也可以在 main 函数里面定义

  • 将枚举类型定义在 main 函数外面(通常是文件的全局作用域),可以使枚举类型在整个文件中可见,便于在多个函数中使用。 
  • 将枚举类型定义在 main 函数内部,可以使枚举类型的作用域限制在 main 函数内,避免污染全局命名空间。

2.2 枚举元素的特点

        枚举元素,也称为枚举成员枚举常量,具有以下特征:

        唯一性在同一枚举类型中,每个枚举常量的值必须唯一,即不能有两个或多个枚举常量具有相同的值。

        整数类型枚举常量的值必须是整数类型,虽然在大多数编程语言中枚举常量本身不直接表现为整数,但在底层它们通常由整数(通常是 int 类型)表示。

        自定义值:定义枚举时,可以为枚举元素指定自定义的整数值,但需确保这些值的唯一性和整数类型。

        自动递增赋值 

  • 如果没有为枚举常量显式指定值,编译器会自动为它们分配值。这些值通常从 0 开始,依次递增。例如,在一个包含三个枚举常量的枚举类型中,第一个枚举常量会被分配值 0,第二个为 1,第三个为 2。
  • 如果为第一个枚举常量显式赋值,后续的枚举常量没有显式赋值,则后续枚举常量会从该值开始依次递增。例如,如果给第一个枚举常量显式赋值为 1,则第二个枚举常量的值默认为 2,第三个默认为 3,依此类推。
  • 如果中间的某个枚举常量显式赋了某个值,而下一个常量没有显式赋值,那么其默认值将从上一个枚举常量的值开始依次递增。例如,如果给第一个枚举常量显式赋值为 1,则第二个枚举常量的值默认为 2,再给第三个枚举常量显式赋值为 10,则第四个枚举常量的值默认为 11,依此类推。

2.3 案例演示

#include <stdio.h>// 定义枚举类型,表示星期一到星期天,枚举元素的值自动分配,从 0 到 6
enum WEEKDAY
{MONDAY,    // 默认值为 0TUESDAY,   // 默认值为 1WEDNESDAY, // 默认值为 2THURSDAY,  // 默认值为 3FRIDAY,    // 默认值为 4SATURDAY,  // 默认值为 5SUNDAY     // 默认值为 6
};// 定义枚举类型,表示一月到十二月,为第一个枚举元素 JANUARY 指定值 1,其余元素依次递增
enum MONTH
{JANUARY = 1, // 显式赋值为 1FEBRUARY,    // 默认值为 2MARCH,       // 默认值为 3APRIL,       // 默认值为 4MAY,         // 默认值为 5JUNE,        // 默认值为 6JULY,        // 默认值为 7AUGUST,      // 默认值为 8SEPTEMBER,   // 默认值为 9OCTOBER,     // 默认值为 10NOVEMBER,    // 默认值为 11DECEMBER     // 默认值为 12
};// 定义枚举类型,表示北京地区一年四季的平均温度,为每个枚举元素指定特定值,需确保这些值的唯一性和整数类型
enum SEASON
{SPRING = 18, // 显式赋值为 18SUMMER = 30, // 显式赋值为 30AUTUMN = 20, // 显式赋值为 20WINTER = -5  // 显式赋值为 -5
};// 定义枚举类型,测试自动递增赋值
enum EXAMPLE
{NUMA = 10, // 显式赋值为 10NUMB,      // 默认值为 11NUMC = 20, // 显式赋值为 20NUMD       // 默认值为 21
};int main()
{return 0;
}

3 枚举变量

3.1 什么是枚举变量

        定义变量时,如果指定其类型为我们所定义的枚举类型,该变量就称为枚举变量。

        枚举变量的值必须是该枚举类型中的一个枚举常量,不能是其他值。如果是其他值,就失去了枚举的意义,不建议这么做。

3.2 定义枚举变量的多种方式

        第一种:先定义枚举类型,再定义枚举变量。

// 定义枚举类型
enum DAY {MON = 1,TUE,WED,THU,FRI,SAT,SUN
};// 使用枚举类型定义枚举变量
enum DAY day;  // day 是变量名

        第二种:定义枚举类型的同时声明枚举变量。

enum DAY {MON = 1,TUE,WED,THU,FRI,SAT,SUN
} day;  // 直接跟上一个变量名称enum DAY {MON = 1,TUE,WED,THU,FRI,SAT,SUN
} day = TUE; // 可以在这里直接进行赋值enum DAY {MON = 1,TUE,WED,THU,FRI,SAT,SUN
} day1,day2; // 可以一次性声明多个变量

        第三种:定义枚举类型的同时声明枚举变量,且省略枚举名称。

enum            // 省略枚举名称
{ MON = 1,TUE,WED,THU,FRI,SAT,SUN
} day = TUE;    // 可以在这里直接进行赋值enum            // 省略枚举名称
{        MON = 1,TUE,WED,THU,FRI,SAT,SUN
} day1,day2;     // 可以一次性声明多个变量

3.3 案例演示 1:标准版枚举类型

#include <stdio.h>// 定义枚举类型,表示星期一到星期天,枚举元素的值自动分配,从 0 到 6
enum WEEKDAY
{MONDAY,    // 默认值为 0TUESDAY,   // 默认值为 1WEDNESDAY, // 默认值为 2THURSDAY,  // 默认值为 3FRIDAY,    // 默认值为 4SATURDAY,  // 默认值为 5SUNDAY     // 默认值为 6
};// 定义枚举类型,表示一月到十二月,为第一个枚举元素 JANUARY 指定值 1,其余元素依次递增
enum MONTH
{JANUARY = 1, // 显式赋值为 1FEBRUARY,    // 默认值为 2MARCH,       // 默认值为 3APRIL,       // 默认值为 4MAY,         // 默认值为 5JUNE,        // 默认值为 6JULY,        // 默认值为 7AUGUST,      // 默认值为 8SEPTEMBER,   // 默认值为 9OCTOBER,     // 默认值为 10NOVEMBER,    // 默认值为 11DECEMBER     // 默认值为 12
};// 定义枚举类型,表示北京地区一年四季的平均温度,为每个枚举元素指定特定值,需确保这些值的唯一性和整数类型
enum SEASON
{SPRING = 18, // 显式赋值为 18SUMMER = 30, // 显式赋值为 30AUTUMN = 20, // 显式赋值为 20WINTER = -5  // 显式赋值为 -5
};// 定义枚举类型,测试自动递增赋值
enum EXAMPLE
{NUMA = 10, // 显式赋值为 10NUMB,      // 默认值为 11NUMC = 20, // 显式赋值为 20NUMD       // 默认值为 21
};int main()
{// 定义枚举变量并赋值// 枚举变量的值必须是该枚举类型中的一个枚举常量,不能是其他值enum WEEKDAY today = WEDNESDAY;enum MONTH currentMonth = OCTOBER;enum SEASON currentSeason = AUTUMN;enum EXAMPLE num = NUMD;// 输出枚举变量的值printf("今天是 %d \n", today);             // 输出 2printf("当前月份是 %d \n", currentMonth);  // 输出 10printf("当前季节是 %d \n", currentSeason); // 输出 20printf("当前数字是 %d \n", num);           // 输出 21// 修改枚举变量 today 的值为 FRIDAY// 枚举变量的值必须是该枚举类型中的一个枚举常量,不能是其他值。today = FRIDAY;printf("今天是 %d \n", today); // 输出 4// 修改枚举变量 num 的值为 100// 100 并不是枚举类型中的一个常量,这样做虽然不会报错,但失去了枚举的意义,不建议这么做num = 100;printf("当前数字是 %d \n", num); // 输出 100return 0;
}

3.4 案例演示 2:简化版枚举类型

        尽管这种方式简洁,但枚举类型名称仍然存在,可以在后续代码中使用该类型定义更多的变量

        对于复杂的枚举类型或需要在多个地方使用同一枚举类型的场景,建议使用标准的定义方法(即先定义枚举类型,再定义变量),以提高代码的可维护性和可扩展性。

#include <stdio.h>int main()
{// 第一种方式:定义枚举类型并直接声明变量enum DAY{MON = 1,TUE,WED,THU,FRI,SAT,SUN} day1;// 初始化并使用枚举变量 day1day1 = WED;printf("今天是 %d \n", day1); // 输出 3// 修改 day1 的值day1 = FRI;printf("今天是 %d \n", day1); // 输出 5// 第二种方式:定义枚举类型并直接声明并初始化变量enum DAY2{MON2 = 1,TUE2,WED2,THU2,FRI2,SAT2,SUN2} day2 = TUE2;// 使用枚举变量 day2printf("今天是 %d \n", day2); // 输出 2// 第三种方式:定义枚举类型并一次性声明多个变量enum DAY3{MON3 = 1,TUE3,WED3,THU3,FRI3,SAT3,SUN3} day3,day4;// 初始化并使用枚举变量 day3 和 day4day3 = SAT3;day4 = SUN3;printf("今天是 %d \n", day3); // 输出 6printf("今天是 %d \n", day4); // 输出 7// 在后续代码中声明新的变量enum DAY anotherDay = SAT;printf("今天是 %d \n", anotherDay); // 输出 6return 0;
}

3.5 案例演示 3:匿名枚举类型

        由于匿名枚举类型没有名称,因此不能在其他地方重新使用相同的枚举类型定义新的变量。每次需要使用时都需要重新定义整个枚举类型。

        虽然匿名枚举类型可以减少一些冗余代码,但在大型项目中可能会影响代码的可读性和可维护性。建议在简单的情况下使用匿名枚举类型,而在复杂项目中使用带名称的枚举类型。

#include <stdio.h>int main()
{// 定义匿名枚举类型并同时声明多个枚举变量enum{MON = 1,TUE,WED,THU,FRI,SAT,SUN} day1,day2, day3 = WED; // 同时声明多个枚举变量,并初始化 day3// 初始化并使用枚举变量 day1 和 day2day1 = MON;day2 = FRI;// 输出 day1, day2 和 day3 的值printf("day1 是 %d \n", day1); // 输出 1printf("day2 是 %d \n", day2); // 输出 5printf("day3 是 %d \n", day3); // 输出 3// 修改 day1 和 day2 的值day1 = TUE;day2 = SAT;// 再次输出 day1 和 day2 的值printf("day1 是 %d \n", day1); // 输出 2printf("day2 是 %d \n", day2); // 输出 6// 在后续代码中声明新的变量enum{MON2 = 1,TUE2,WED2,THU2,FRI2,SAT2,SUN2} anotherDay = SUN2;printf("anotherDay 是 %d \n", anotherDay); // 输出 7return 0;
}

4 枚举的遍历

4.1 连续枚举常量的遍历

        枚举常量的值如果是连续的,可以通过循环来遍历所有枚举常量。如果枚举常量的值不是连续的,则无法通过简单的循环来遍历,需要考虑其他方法。

#include <stdio.h>int main()
{// 定义枚举类型 WEEKDAY,表示星期一到星期天,值从 1 开始enum WEEKDAY{MONDAY = 1,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY};// 使用循环遍历出所有的枚举常量for (enum WEEKDAY day = MONDAY; day <= SUNDAY; day++){printf("星期 %d \n", day);}return 0;
}

        输出结果如下所示:

4.2 非连续枚举常量的遍历

        对于非连续的枚举常量,由于它们的值不是连续的,不能通过简单的循环来遍历。但是,可以通过以下几种方法来实现遍历:

4.2.1 手动遍历每个枚举常量

        直接列出每个枚举常量并处理它们。

#include <stdio.h>int main()
{// 定义枚举类型 SEASON,表示北京地区一年四季的平均温度enum SEASON{SPRING = 18,SUMMER = 30,AUTUMN = 20,WINTER = -5};// 尝试遍历非连续的枚举常量// 注意:这种遍历方式是错误的,因为枚举常量的值不是连续的// 下面这个循环一次都不会执行。因为循环条件一直都不满足for (enum SEASON season = SPRING; season <= WINTER; season++){printf("季节 %d \n", season); // 不会执行}// 手动遍历每个枚举常量printf("季节 %d \n", SPRING);printf("季节 %d \n", SUMMER);printf("季节 %d \n", AUTUMN);printf("季节 %d \n", WINTER);return 0;
}

        输出结果如下所示:

4.2.2 使用数组存储枚举常量

        将枚举常量的值存储在一个数组中,然后遍历数组。

#include <stdio.h>int main()
{// 定义枚举类型 SEASON,表示北京地区一年四季的平均温度enum SEASON{SPRING = 18,SUMMER = 30,AUTUMN = 20,WINTER = -5};// 使用数组存储枚举常量的值enum SEASON seasons[] = {SPRING, SUMMER, AUTUMN, WINTER};int num_seasons = sizeof(seasons) / sizeof(seasons[0]);// 遍历数组for (int i = 0; i < num_seasons; i++){printf("季节 %d \n", seasons[i]);}return 0;
}

        输出结果如下所示:


5 枚举在 switch 中使用

        枚举可以与 switch 结合使用,通过枚举常量来控制不同的分支逻辑。以下是一个示例,展示了如何使用枚举和 switch 语句来处理用户输入的季节选择。

#include <stdio.h>int main()
{// 定义枚举类型 SEASONS,表示四个季节enum SEASONS{SPRING = 1, // 春天SUMMER,     // 夏天AUTUMN,     // 秋天WINTER      // 冬天};// 定义枚举变量 seasonenum SEASONS season;// 获取用户输入printf("请输入你喜欢的季节: (1:spring, 2:summer, 3:autumn, 4:winter): ");scanf("%d", &season);// 使用 switch 语句判断用户输入的季节switch (season){case SPRING:printf("你喜欢的季节是春天。\n");break;case SUMMER:printf("你喜欢的季节是夏天。\n");break;case AUTUMN:printf("你喜欢的季节是秋天。\n");break;case WINTER:printf("你喜欢的季节是冬天。\n");break;default:printf("你没有选择你喜欢的季节。\n");break;}return 0;
}

        在上面的示例中,使用 scanf 函数读取用户输入的整数值,并将其存储在枚举变量中。需要注意的是,用户输入的值必须是枚举常量的有效值,否则会进入 default 分支。


6 枚举数组

        枚举数组是指数组的元素类型为枚举类型。通过定义枚举数组,可以方便地管理和操作一组枚举常量。以下是一些关于枚举数组的示例和解释。

#include <stdio.h>int main()
{// 定义枚举类型 SOLAR_TERMS,表示 24 节气enum SOLAR_TERMS{LICHUN = 1,  // 立春YUSHUI,      // 雨水JINGZHE,     // 惊蛰CHUNFEN,     // 春分QINGMING,    // 清明GUYU,        // 谷雨LIXIA,       // 立夏XIAOMAN,     // 小满MANGZHONG,   // 芒种XIAZHI,      // 夏至XIAOSHU,     // 小暑DASHU,       // 大暑LIQIU,       // 立秋CHUSHU,      // 处暑BAILE,       // 白露QIUFEN,      // 秋分HANLU,       // 寒露SHUANGJIANG, // 霜降LIDONG,      // 立冬XIAOXUE,     // 小雪DAXUE,       // 大雪DONGZHI,     // 冬至XIAOHAN,     // 小寒DAHAN        // 大寒};// 定义一个枚举数组,存储多个节气enum SOLAR_TERMS terms[] = {LICHUN, YUSHUI, JINGZHE, CHUNFEN, QINGMING, GUYU,LIXIA, XIAOMAN, MANGZHONG, XIAZHI, XIAOSHU, DASHU,LIQIU, CHUSHU, BAILE, QIUFEN, HANLU, SHUANGJIANG,LIDONG, XIAOXUE, DAXUE, DONGZHI, XIAOHAN, DAHAN};// 获取数组的大小int num_terms = sizeof(terms) / sizeof(terms[0]);// 遍历枚举数组并输出每个节气for (int i = 0; i < num_terms; i++){switch (terms[i]){case LICHUN:printf("节气 %d: 立春\n", terms[i]);break;case YUSHUI:printf("节气 %d: 雨水\n", terms[i]);break;case JINGZHE:printf("节气 %d: 惊蛰\n", terms[i]);break;case CHUNFEN:printf("节气 %d: 春分\n", terms[i]);break;case QINGMING:printf("节气 %d: 清明\n", terms[i]);break;case GUYU:printf("节气 %d: 谷雨\n", terms[i]);break;case LIXIA:printf("节气 %d: 立夏\n", terms[i]);break;case XIAOMAN:printf("节气 %d: 小满\n", terms[i]);break;case MANGZHONG:printf("节气 %d: 芒种\n", terms[i]);break;case XIAZHI:printf("节气 %d: 夏至\n", terms[i]);break;case XIAOSHU:printf("节气 %d: 小暑\n", terms[i]);break;case DASHU:printf("节气 %d: 大暑\n", terms[i]);break;case LIQIU:printf("节气 %d: 立秋\n", terms[i]);break;case CHUSHU:printf("节气 %d: 处暑\n", terms[i]);break;case BAILE:printf("节气 %d: 白露\n", terms[i]);break;case QIUFEN:printf("节气 %d: 秋分\n", terms[i]);break;case HANLU:printf("节气 %d: 寒露\n", terms[i]);break;case SHUANGJIANG:printf("节气 %d: 霜降\n", terms[i]);break;case LIDONG:printf("节气 %d: 立冬\n", terms[i]);break;case XIAOXUE:printf("节气 %d: 小雪\n", terms[i]);break;case DAXUE:printf("节气 %d: 大雪\n", terms[i]);break;case DONGZHI:printf("节气 %d: 冬至\n", terms[i]);break;case XIAOHAN:printf("节气 %d: 小寒\n", terms[i]);break;case DAHAN:printf("节气 %d: 大寒\n", terms[i]);break;default:printf("未知节气\n");break;}}return 0;
}

相关文章:

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

目录 1 什么是枚举 2 定义枚举类型 2.1 语法格式 2.2 枚举元素的特点 2.3 案例演示 3 枚举变量 3.1 什么是枚举变量 3.2 定义枚举变量的多种方式 3.3 案例演示 1&#xff1a;标准版枚举类型 3.4 案例演示 2&#xff1a;简化版枚举类型 3.5 案例演示 3&#xff1a;匿…...

LabVIEW程序怎么解决 Bug?

在LabVIEW开发过程中&#xff0c;发现和解决程序中的Bug是确保系统稳定运行的关键环节。由于LabVIEW采用图形化编程方式&#xff0c;Bug的排查和处理与传统编程语言略有不同。以下是解决LabVIEW程序中Bug的常见方法和技巧&#xff0c;涵盖从问题发现到解决的多个步骤和角度&…...

AR智能眼镜之战:Meta vs Snap

随着增强现实(AR)技术的发展,各大科技公司都在争夺下一代计算平台的领先地位。Meta(前身为Facebook)和Snap作为其中的两个重要玩家,正在竞相开发能够提供沉浸式体验的AR智能眼镜。在这篇文章中,我们将深入探讨这两家公司可能采用的显示技术和用户体验,并分析它们各自的…...

Spring Boot 集成 Flowable UI 实现请假流程 Demo

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代企业应用中&#xff0c;工作流管理是一个至关重要的部分。通过使用Spring Boot和Flowable&#xff0c;可以方便地构建和管理工作流。本文将详细介绍如何在Spring Boot项目中集成Flowable UI&#xff0c…...

毕业设计选题:基于ssm+vue+uniapp的医院管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

自动驾驶系列—线控悬架技术:自动驾驶背后的动力学掌控者

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

CTF刷题buuctf

[WUSTCTF2020]颜值成绩查询 拿到相关题目&#xff0c;其实根据功能和参数分析。需要传入一个学号然后进行针对于对应的学号进行一个查询&#xff0c;很可能就会存在sql注入。 其实这道题最难的点&#xff0c;在于过滤了空格&#xff0c;因此我们使用 /**/来过滤空格的限制。…...

Qt QWidget控件

目录 一、概述 二、Qwidget常用属性及函数介绍 2.1 enable 2.2 geometry 2.3 windowTitle 2.4 windowIcon 2.5 cursor 2.6 font 设置字体样式 2.7 toolTip 2.8 focusPolicy焦点策略 2.9 styleSheet 一、概述 widget翻译而来就是小控件&#xff0c;小部件。…...

如何通过Dockfile更改docker中ubuntu的apt源

首先明确我们有一个宿主机和一个docker环境&#xff0c;接下来的步骤是基于他们两个完成的 1.在宿主机上创建Dockerfile 随便将后面创建的Dockerfile放在一个位置,我这里选择的是 /Desktop 使用vim前默认你已经安装好了vim 2.在输入命令“vim Dockerfile”之后&#xff0c;…...

[C++][第三方库][jsoncpp]详细讲解

目录 1.介绍2.jsoncpp3.使用1.main.cc2.序列化3.反序列化 1.介绍 json是一种数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据json数据类型&#xff1a;对象、数组、字符串、数字 对象&#xff1a;使用{}括起来的表示一个对象数组&#xff1a;使用[…...

JavaScript中decodeURIComponent函数的深入解析与应用指南

在Web开发中&#xff0c;经常需要对URI&#xff08;统一资源标识符&#xff09;进行编码和解码&#xff0c;以保证数据传输的准确性和可靠性。decodeURIComponent函数是JavaScript中用于解码由encodeURIComponent函数或其他类似方法编码的部分统一资源标识符&#xff08;URI&am…...

DMA方式为什么无需保护现场

DMA&#xff08;Direct Memory Access&#xff09;方式无需保护现场的原因主要与其工作原理和硬件设计有关。以下是对这一问题的详细解释&#xff1a; DMA工作原理 DMA是一种通过硬件直接在内存和外设之间传输数据的技术&#xff0c;无需CPU的介入。在DMA传输过程中&#xff…...

区块链可投会议CCF C--FC 2025 截止10.8 附录用率

Conference&#xff1a;Financial Cryptography and Data Security (FC) CCF level&#xff1a;CCF C Categories&#xff1a;network and information security Year&#xff1a;2025 Conference time&#xff1a;14–18 April 2025, Miyakojima, Japan 录用率&#xff1…...

springboot系列--web相关知识探索四

一、前言 web相关知识探索三中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索三中主要研究了注解方式以及Servlet API方式。本次…...

在PyQt5中,清空一个QFrame中的所有控件

在PyQt5中&#xff0c;如果你想要清空一个QFrame中的所有控件&#xff0c;你需要遍历该QFrame的布局&#xff08;假设你已经在其中添加了一个布局&#xff0c;比如QVBoxLayout或QHBoxLayout&#xff09;&#xff0c;并从布局中移除所有的控件。由于直接从布局中移除控件并不会立…...

SpringBoot实现:校园资料分享平台开发指南

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…...

引领5G驱动的全球数字营销革新:章鱼移动广告全球平台的崛起

引领5G驱动的全球数字营销革新&#xff1a;章鱼移动广告全球平台的崛起 作为章鱼移动广告平台的营销战略顾问&#xff0c;黄珍珍通过她在市场营销、品牌推广、技术整合等多方面的丰富经验&#xff0c;成功推动了这一平台在全球广告市场的崛起。她不仅为平台的国际化扩展奠定了基…...

思维链ChatGPT

建立客户端 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )示例1 response client.chat.completions.create(model"gpt-3.5-turbo",messages[{"role": "user","content": &quo…...

idea中的Java版本运行错误

1.java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid 这个错误通常是由于升级到Java 21后,Lombok等库无法正确访问内部的Java编译器API导致的。具体原因如下: Lombok在…...

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日&#xff0c;中华人民共和国中央人民政府成立&#xff0c;在首都北京天安门广场举行了开国大典&#xff0c;中央人民政府主席毛泽东庄严宣告中华人民共和国成立&#xff0c;并亲手升起了…...

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景&#xff0c;以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容&#xff0c;…...

【Mac】和【安卓手机】 通过有线方式实现投屏

Mac 和 安卓手机 实现投屏&#xff08;有线&#xff09; 1.下载HomeBrew /bin/bash -c "$(curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install/master/install.sh)"2.安装Scrcpy brew install scrcpy3.安装adb brew install android-platfor…...

GitHub flow工作流

github.com github.com使用自己版本的标记语法&#xff0c;它提供了一组额外的有用的 特性&#xff0c;其中许多特性使处理github.com上的内容更加容易。 用户名-提及 键入一个符号&#xff0c;后跟一个用户名&#xff0c;将通知此人前来查看评论。 这叫做“提及”&#x…...

【Qt笔记】QFrame控件详解

目录 引言 一、QFrame的基本特性 二、QFrame的常用方法 2.1 边框形状&#xff08;Frame Shape&#xff09; 2.2 阴影样式&#xff08;Frame Shadow&#xff09; 2.3 线条宽度&#xff08;Line Width&#xff09; 2.4 样式表(styleSheet) 三、QFrame的应用场景 四、应用…...

【二十八】【QT开发应用】模拟WPS Tab

WidgetBase 类旨在实现窗口的可调整大小功能&#xff0c;使用户能够手动改变窗口的尺寸。该类通过以下机制实现窗口缩放效果&#xff1a;当鼠标移动至窗口边缘时&#xff0c;鼠标指针样式会动态改变以指示可调整大小的方向。用户在边缘区域按下鼠标左键后&#xff0c;可以通过拖…...

PyQt入门指南四 事件处理机制详解

1. 事件处理概述 在PyQt中&#xff0c;事件处理是实现交互性的关键部分。事件可以是用户的操作&#xff08;如点击按钮、键盘输入&#xff09;&#xff0c;也可以是系统的通知&#xff08;如窗口最小化、定时器超时&#xff09;。PyQt使用信号&#xff08;Signals&#xff09;…...

【24最新亲试】ubuntu下载go最新版本

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了工具配置的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Ubuntu 升级 golang 版本完美步骤进行的&#xff0c;每个知识点的修…...

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…...

STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系 本文并不将FATFS的相关接口操作&#xff0c;而是将HAL在使用FATFS通过SDIO外设管理SD卡时&#xff0c;内部函数的调用逻辑&#xff0c;有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现…...