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:标准版枚举类型 3.4 案例演示 2:简化版枚举类型 3.5 案例演示 3:匿…...
LabVIEW程序怎么解决 Bug?
在LabVIEW开发过程中,发现和解决程序中的Bug是确保系统稳定运行的关键环节。由于LabVIEW采用图形化编程方式,Bug的排查和处理与传统编程语言略有不同。以下是解决LabVIEW程序中Bug的常见方法和技巧,涵盖从问题发现到解决的多个步骤和角度&…...
AR智能眼镜之战:Meta vs Snap
随着增强现实(AR)技术的发展,各大科技公司都在争夺下一代计算平台的领先地位。Meta(前身为Facebook)和Snap作为其中的两个重要玩家,正在竞相开发能够提供沉浸式体验的AR智能眼镜。在这篇文章中,我们将深入探讨这两家公司可能采用的显示技术和用户体验,并分析它们各自的…...
Spring Boot 集成 Flowable UI 实现请假流程 Demo
博客主页: 南来_北往 系列专栏:Spring Boot实战 在现代企业应用中,工作流管理是一个至关重要的部分。通过使用Spring Boot和Flowable,可以方便地构建和管理工作流。本文将详细介绍如何在Spring Boot项目中集成Flowable UI,…...
毕业设计选题:基于ssm+vue+uniapp的医院管理系统小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
自动驾驶系列—线控悬架技术:自动驾驶背后的动力学掌控者
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
CTF刷题buuctf
[WUSTCTF2020]颜值成绩查询 拿到相关题目,其实根据功能和参数分析。需要传入一个学号然后进行针对于对应的学号进行一个查询,很可能就会存在sql注入。 其实这道题最难的点,在于过滤了空格,因此我们使用 /**/来过滤空格的限制。…...
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翻译而来就是小控件,小部件。…...
如何通过Dockfile更改docker中ubuntu的apt源
首先明确我们有一个宿主机和一个docker环境,接下来的步骤是基于他们两个完成的 1.在宿主机上创建Dockerfile 随便将后面创建的Dockerfile放在一个位置,我这里选择的是 /Desktop 使用vim前默认你已经安装好了vim 2.在输入命令“vim Dockerfile”之后,…...
[C++][第三方库][jsoncpp]详细讲解
目录 1.介绍2.jsoncpp3.使用1.main.cc2.序列化3.反序列化 1.介绍 json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据json数据类型:对象、数组、字符串、数字 对象:使用{}括起来的表示一个对象数组:使用[…...
JavaScript中decodeURIComponent函数的深入解析与应用指南
在Web开发中,经常需要对URI(统一资源标识符)进行编码和解码,以保证数据传输的准确性和可靠性。decodeURIComponent函数是JavaScript中用于解码由encodeURIComponent函数或其他类似方法编码的部分统一资源标识符(URI&am…...
DMA方式为什么无需保护现场
DMA(Direct Memory Access)方式无需保护现场的原因主要与其工作原理和硬件设计有关。以下是对这一问题的详细解释: DMA工作原理 DMA是一种通过硬件直接在内存和外设之间传输数据的技术,无需CPU的介入。在DMA传输过程中ÿ…...
区块链可投会议CCF C--FC 2025 截止10.8 附录用率
Conference:Financial Cryptography and Data Security (FC) CCF level:CCF C Categories:network and information security Year:2025 Conference time:14–18 April 2025, Miyakojima, Japan 录用率࿱…...
springboot系列--web相关知识探索四
一、前言 web相关知识探索三中研究了请求中所带的参数是如何映射到接口参数中的,也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索三中主要研究了注解方式以及Servlet API方式。本次…...
在PyQt5中,清空一个QFrame中的所有控件
在PyQt5中,如果你想要清空一个QFrame中的所有控件,你需要遍历该QFrame的布局(假设你已经在其中添加了一个布局,比如QVBoxLayout或QHBoxLayout),并从布局中移除所有的控件。由于直接从布局中移除控件并不会立…...
SpringBoot实现:校园资料分享平台开发指南
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
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驱动的全球数字营销革新:章鱼移动广告全球平台的崛起 作为章鱼移动广告平台的营销战略顾问,黄珍珍通过她在市场营销、品牌推广、技术整合等多方面的丰富经验,成功推动了这一平台在全球广告市场的崛起。她不仅为平台的国际化扩展奠定了基…...
思维链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在…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
