C++ Primer 条件语句
专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!
目录
- 5.3 条件语句
- if语句
- 使用if else语句
- 嵌套if语句
- 注意使用花括号
- 悬垂else
- 使用花括号控制执行路径
- switch语句
- switch内部的控制流
- 漏写break容易引发缺陷
- switch内部的变量定义
5.3 条件语句
C++语言提供了两种按条件执行的语句。一种是if语句,它根据条件决定控制流;另外一种是switch语句,它计算一个整型表达式的值,然后根据这个值从几条执行路径中选择一条。
if语句
if语句(if statement〉的作用是:判断一个指定的条件是否为真,根据判断结果决定是否执行另外一条语句。if语句包括两种形式:一种含有else分支,另外一种没有。简单if 语句的语法形式是
if(condiion)statement
// if else 语句的形式是
if(condition)statement
elsestalement2
在这两个版本的if语句中,condition都必须用圆括号包围起来。condition可以是一个表达式,也可以是一个初始化了的变量声明。不管是表达式还是变量,其类型都必须能转换成布尔类型。通常情况下,statemet 和 statemet2 是块语句。
如果condition为真,跳过statement。对于简单if语句来说,程序继续执行if语句后面的其他语句;对于if else语句来说,执行statement。
使用if else语句
我们举个例子来说明if语句的功能,程序的目的是把数字形式表示的成绩转换成宇母形式。假设数字成绩的范围是从0到100(包括100在内),其中100分对应的字母形式是“A++“,低于60分的成绩对应的字母形式是“F“。其他成绩每10个划分成一组;60到69(包括69在内)对应字母“D“70到79对应字母“C“,以此类推。使用vector对象存放字母成绩所有可能的取值:
const vector<string> scores = ("F","D","C","B","A++")我们使用if else语句解决该问题,根据成绩是否合格执行不同的操作:
//如果grade小于60,对应的字母是F;否则计算其下标```cpp
string lettergrade;
if(grade < 60)lettergrade=scores[0];
elselettergrade = scores[(grade-50)/10];
判断grade的值是否小于60,根据结果选择执行if分支还是else分支。在else分支中,由成绩计算得到一个下标,具体过程是:首先从grade中减去50,然后执行整数除法,去掉余数后所得的商就是数组scores对应的下标。
嵌套if语句
接下来让我们的程序更有趣点儿,试着给那些合格的成绩后面添加一个加号或减号。如果成绩的末位是8或者9,添加一个加号;如果末位是0、1或2,添加一个减号:
if(grade % 10>7)lettergrade+='+';//结尾是8或者9的成绩添加一个加号
else if(grade%10<3)lettergrade+='-';//末尾是0、1或者2的成绩添加一个减号
我们使用取模运算符计算余数,根据余数决定添加哪种符号。接着把这段添加符号的代码整合到转换成绩形式的代码中去:
//如果成绩不合格,不需要考虑添加加号减号的问题
if(grade<60)lettergrade=scores[0];
elselettergrade=scores[(grade-50)/10];//获得字母形式的成绩if(grade!=100)//只要不是A++,就考虑添加加号或减号if(grade%10>7)lettergrade +='+';//未尾是8或者9的成绩添加一个加号
else if(grade%10<3)lettergrade += '-';//末尾是0、1或者2的成绩添加一个减号
注意,我们使用花括号把第一个else后面的两条语句组合成了一个块。如果grade不小于60要做两件事:从数组scores中获取对应的字母成绩,然后根据条件设置加号或减号。
注意使用花括号
有一种常见的错误:本来程序中有几条语句应该作为一个块来执行,但是我们忘了用花括号把这些语句包围。在下面的例子中,添加加号减号的代码将被无条件地执行,这显然违背了我们的初衷:
if(grade<60)lettergrade=scores[0];
else//错误:缺少花括号lettergrade=scores[(grade-50)/10];//虽然下面的语句从形式上看有缩进,但是图为没有花括号,//所以无论什么情况都会执行接下来的代码//不及格的成绩也会添加上加号或减号,这显然是错误的
if(grade!=100)if(grade%10>7)lettergrade+='+';//末尾是8或者9的成绩添加一个加号else if(grade%10<3)lettergrade+='-';//未尾是0、1或者2的成绩添加一个减号
要想发现这个错误可能非常困难,毕竟这段代码"看起来"是正确的。为了避免此类问题,有些编码风格要求在if或else之后必须写上花括号(对while和for语句的循环体两端也有同样的要求)。这么做的好处是可以避免代码混乱不清,以后修改代码时如果想添加别的语句,也可以很容易地找到正确位置。许多编辑器和开发环境都提供一种辅助工具,它可以自动地缩进代码以匹配其语法结构。
悬垂else
当一个if语句嵌套在另一个if语句内部时,很可能if分支会多于else分支。事实上,之前那个成绩转换的程序就有4个if分支,而只有2个else分支。这时候问题出现了:我们怎么知道某个给定的else是和哪个if匹配呢?
这个问题通常称作悬垂else(dangling else),在那些既有if语句又有if else语句的编程语言中是个普道存在的问题。不同语言解决该问题的思路也不同,就C++而言,它规定else与离它最近的尚未匹配的if匹配,从而消除了程序的二义性。
当代码中if分支多于else分支时,程序员有时会感觉比较麻烦。举个例子来说明,对于添加加号减号的那个最内层的if else语句,我们用另外一组条件改写它:
//错误:实际的执行过程并非像缩进格式显示的那样;else分支匹配的是内层if语句
if(grade%10>=3)if(grade%10>7)lettergrade+='+';//未尾是8或者9的成绩添加一个加号
elselettergrade+='-';//末尾是3、4、5、6或者7的成绩添加一个减号!
从代码的缩进格式来看,程序的初衷应该是希望else和外层的if匹配,也就是说,我们希望当grade的未位小于3时执行else分支。然而,不管我们是什么意图,也不管程序如何缩进,这里的else分支其实是内层if语句的一部分。最终,上面的代码将在末位大于3小于等于7的成绩后面添加减号!它的执行过程实际上等价于如下形式:
//缩进格式与执行过程相符,但不是程序员的意图
if(grade%10>=3)
i(grade%10>7)lettergrade+="+";//末尾是8或者9的成绩添加一个加号
elselettergrade+="-";//末尾是3、4、5、6或者7的成绩添加一个减号!
使用花括号控制执行路径
要想使else分支和外层的if语句匹配起来,可以在内层if语句的两端加上花括号,其成为一个块:
//末尾是8或者9的成绩添加一个加号,末尾是0、1或者2的成绩添加一个减号
if(grade%10>=3){
if(grade%10>7)lettergrade+="+";//末尾是8或者9的成绩添加一个加号
}else//花括号强迫else与外层if匹配lettergrade+="-";//末尾是0、1或者2的成绩添加一个减号
语句属于块,意味着语句一定在块的边界之内,因此内层if语句在关键字else前面的那个花括号处已经结束了。else不会再作为内层if的一部分。此时,最近的尚未匹配的if是外层if,也就是我们希望else匹配的那个。
switch语句
switch语句(switch statement)提供了一条便利的途径使得我们能够在若干固定选项中做出选择。举个例子,假如我们想统计五个元音字母在文本中出现的次数,程序逻辑应该如下所示:
- 从输入的内容中读取所有字符。
- 令每一个字符都与元音字母的集合比较。
- 如果字符与某个元音字母匹配,将该字母的数量加1。
- 显示结果。
例如,本章的文本作为输入内容,程序的输出结果将是:
Number of vowel a:3195
Number of vowel e:6230
Number of vowel i:3102
Number of vowel o:3289
Number of vowel u:1033
要想实现这项功能,直接使用switch语句即可:
//为每个元音字母初始化其计数值
unsigned aCnt=0,eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while(cin>>ch){
//如果ch是元音守母,将其对应的计数值加1switch(ch){case 'a':++aCnt;break;case 'e':++eCnt;break;case 'i':++iCnt;break;case 'o':++oCnt;break;case 'u':++uCnt;break;
//输出结果cout<< "Number of vowel a: \t" << aCnt << '\n'
<< "Number of vowel e: \t" << eCnt << '\n'
<< "Number of vowel i: \t" << iCnt << '\n'
<< "Number of vowel t: \t" << oCnt << '\n'
<< "Number of vowel t: \t" << uCnt << '\n'
switch语句首先对括号里的表达式求值,该表达式紧跟在关键字switch的后面,可以是一个初始化的变量声明。表达式的值转换成整数类型,然后与每个case标签的值比较。
如果表达式和某个case标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达了switch的结尾或者是遇到一条break语句为止。简言之,break语句的作用是中断当前的控制流。此例中,break语句将控制权转移到switch语句外面.因为switch是while循环体内唯一的语句,所以从switch语句中断出来以后,程序的控制权将移到while语句的右花括号处。此时while语句内部没有其他语句要执行,所以while会返回去再一次判断条件是否满足。
如果switch语句的表达式和所有case都没有匹配上,将直接跳转到switch结构之后的第一条语句。刚刚说过,在上面的例子中,退出switch后控制权回到while语句的条件部分。
case关键字和它对应的值一起被称为case标签(case label)。case标签必须是整型常量表达式:
char ch=getVal();
int ival=42;
switch(ch){case 3.14://错误:case标签不是一个整数case ival://错误:case标签不是一个常量
}
任何两个case标签的值不能相同,否则就会引发错误。另外,default也是一种特殊的case标签。
switch内部的控制流
理解程序在case标签之间的执行流程非常重要。如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非程序显式地中断了这一过程,否则直到switch的结尾处才会停下来。要想避免执行后续case分支的代码,我们必须显式地告诉编译器终止执行过程。大多数情况下,在下一个case标签之前应该有一条break语句。
然而,也有一些时候默认的switch行为才是程序真正需要的。每个case标签只能对应一个值,但是有时候我们希望两个或更多个值共享同一组操作。此时,我们就故意省略掉break语句,使得程序能够连续执行若干个case标签。
例如,也许我们想统计的是所有元音字母出现的总次数:
unsigned vowelCnt=0;
switch(ch)
{//出现了a、e、i、o或u 中的任意一个都会将vowelCnt的值加1case 'a':case 'e':case 'i':case 'o':case 'u':++vowelCnt;break;
}
在上面的代码中,几个case标签连写在一起,中间没有break语句。因此只要ch是元音字母,不管到底是五个中的哪一个都执行相同的代码。C++程序的形式比较自由,所以case标签之后不一定非得换行。把几个case标签写在一行里,强调这些case代表的是某个范围内的值:
switch(ch){//另一种合法的书写形式case 'a': case 'e': case 'i':case 'o': case 'u':++vowelCnt;break;
}
一般不要省略case分支最后的break语句,如果没有写break语句,最好加一段注释说清楚程序的逻辑。
漏写break容易引发缺陷
有一种常见的错觉是程序只执行匹配成功的那个case分支的语句。例如,下面程序的统计结果是错误的:
//警告:不正确的程序逻辑!
switch(ch){
casSe 'a':++aCnt;//此处应该有一条break语句
case 'e':++eCnt;//此处应该有一条break语句
case 'i':++iCnt;//此处应该有一条break语句
case 'o':++oCnt;//此处应该有一条break语句
case 'u':++uCnt;
}
要想理解这段程序的执行过程,不妨假设ch的值是’e’。此时,程序直接执行case 'e’标签后面的代码,该代码把eCnt的值加1。接下来,程序将跨越case标签的边界,接着递增iCnt、oCnt和uCnt。
default标签
如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签(default label)后面的语句。例如,可以增加一个计数值来统计非元音字母的数量,只要在default分支内不断递增名为otherCnt的变量就可以了:
//如果ch是一个元音字母,将相应的计数值加1
switch(ch){
case 'a':case 'e':case 'i':case 'u':++vawelCnt;break;
default:++otherCnt;break;
}
在这个版本的程序中,如果ch不是元音字母,就从default标签开始执行并把 otherCnt加1。
即使不准备在default标签下做任何工作,定义一个default标签也是有用的。其目的是告诉读者,我们已经考虑到默认情况,只是目前什么也没有做。
标签不应该孤零零地出现,它后面必须跟上一条语句或者另外一个case标签。如果switch结构以一个空的default标签作为结束,则该default标签后面必须跟上一条语句或一个空块。
switch内部的变量定义
如前所述,switch的执行流程有可能会跨过某些case标签。如果程序跳转到了某个特定的case,则switch结构中该case标签之前的部分会被忽略掉。这种忽略掉一部分代码的行为引出了一个有趣的问题:如果被略过的代码中含有变量的定义该怎么办?
答案是:如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。
case true:
//因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法
string file_name;//错误:控制流绕过一个隐式初始化的变量
int val=0;//错误:控制流绕过一个显式初始化的变量
int jval;//正确:因为jval没有初始化
break;
case false:
//正确:jval虽然在作用域内,但是它没有被初始化
jval=next_num()}//正确:给jgal赋一个值
if(filename.empty())//file_name在作用域内,但是没有被初始化
//...
假设上述代码合法,则一旦控制流直接跳到false分支,也就同时略过了变量fil1e_name和ival的初始化过程。此时这两个变量位于作用域之内,跟在false之后的代码试图在尚未初始化的情况下使用它们,这显然是行不通的。因此C++语言规定,不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外。
case true: {//正确:声明语句位于语句块内部string file_name=get_file_name();}break;
case false:if(file_name.empty())// 错误:fine_name 不在作用域之内
相关文章:
C++ Primer 条件语句
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试
前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…...
16.React学习笔记.React更新机制
一. 发生更新的时机以及顺序## image.png props/state改变render函数重新执行产生新的VDOM树新旧DOM树进行diff计算出差异进行更新更新到真实的DOM 二. React更新流程## React将最好的O(n^3)的tree比较算法优化为O(n)。 同层节点之间相互比较,不跨节点。不同类型的节…...
React使用 useImperativeHandle 自定义暴露给父组件的实例方法(包括依赖)
关键词 React useImperativeHandle 摘要 useImperativeHandle 是 React 提供的一个自定义 Hook,用于在函数组件中显式地暴露给父组件特定实例的方法。本文将介绍 useImperativeHandle 的基本用法、常见应用场景,以及如何处理其依赖项,以帮…...
Vue 过渡动画实现全解析:打造丝滑交互体验
Vue 过渡动画实现全解析:打造丝滑交互体验 在当今竞争激烈的 Web 开发领域,用户体验已成为衡量项目成功与否的关键指标。过渡动画作为提升用户体验的利器,能让应用的交互更加丝滑流畅,给用户带来愉悦的使用感受。在 Vue.js 框架中…...
从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)
个人主页:chian-ocean 前言: 随着人工智能技术的迅速发展,大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司,凭借其高效的 AI 模型和开源的优势,吸引了越来越多的开发者和企业关注。为了更好地…...
Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
有一个 Vue 前端 和 Spring Boot 后端的动态网页游戏,当前在本地的 5173 端口和运行。你希望生成一个公开链接,让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install 后才能启动,你现在想知道在部署时是选择 Ren…...
Linux——信号的保存与处理
前言:本文主要介绍信号的保存与处理过程。 一、信号阻塞与信号底层逻辑 在linux下面的进程控制块(PCB),存在一个pending变量用于存放接收到的信号,该变量有32位,变量的位代表信号的类别,变量的值代表是否收到信号。进程会根据该变…...
【deepseek-r1本地部署】
首先需要安装ollama,之前已经安装过了,这里不展示细节 在cmd中输入官网安装命令:ollama run deepseek-r1:32b,开始下载 出现success后,下载完成 接下来就可以使用了,不过是用cmd来运行使用 可以安装UI可视化界面&a…...
Docker Desktop Windows 安装
一、先下载Docker desktop WIndows 下载地址 二、安装 安装超简单 一路 下一步 三、安装之后,桌面会出现一个 小蓝鲸图标,打开它 》更新至最新版本,不然小蓝鲸打开,一会就退出了。 》wsl --update (这个有时比较慢…...
pytorch环境已安装库汇总
简略版总计:python pytorch nb_conda(Jupyter Notebook的插件) 创建环境conda create -n pytorch python3.8 conda install nb_conda命令...
基于Django以及vue的电子商城系统设计与实现
基于Django以及vue的电子商城系统设计与实现 引言 随着电子商务的快速发展,越来越多的企业和个人选择搭建线上商城,以提供更加便捷的购物体验。本文基于Python开发了一套电子商城系统,后端采用Django框架,前端使用Vue.js&#x…...
Spring Boot + ShardingSphere 踩坑记
最近在准备秋招,偷了个轮子项目之后想改个分表,于是有了这篇文章。 省流:请使用shardingsphere-jdbc 5.5.2,并根据官方5.5.2版本文档进行配置,不要使用starter。此外,如果希望使用INTERVAL分片算法&#x…...
【算法学习】DFS与BFS
目录 一,深度优先搜索 1,DFS 2,图的DFS遍历 (1),递归实现(隐士栈) (2),显示栈实现(非递归) 二,广度优先搜索 1,BFS 2,图的BF…...
从零到一:开发并上线一款极简记账本小程序的完整流程
从零到一:开发并上线一款极简记账本小程序的完整流程 目录 前言需求分析与功能设计 2.1 目标用户分析2.2 核心功能设计2.3 技术栈选择 开发环境搭建 3.1 微信开发者工具安装与配置3.2 项目初始化3.3 版本控制与协作工具 前端开发 4.1 页面结构与布局4.2 组件化开发…...
centos安装Nexus Repository OSS(Maven私服)
1. 下载链接:https://help.sonatype.com/en/download.html 2. 注意页面下载页面中的要求:JDK17(启动时提示最低JDK1.8最高JDK17,但是使用JDK1.8无法正常启动) 3. mkdir /opt/nexus 将压缩包上传到该目录并解压。 tar …...
Unity使用iTextSharp导出PDF-02基础结构及设置中文字体
基础结构 1.创建一个Document对象 2.使用PdfWriter创建PDF文档 3.打开文档 4.添加内容,调用文档Add方法添加内容时,内容写入到输出流中 5.关闭文档 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…...
CSS 属性选择器详解与实战示例
CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器,它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中,属性选择器不仅可以提高代码的可维护性,而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例,从基础…...
【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)
在神经网络中,输出层(Output Layer) 的激活函数(Activation Function)直接决定了模型的输出形式,并影响损失函数的选择及训练效果。不同的任务类型(如分类或回归)需要使用不同的激活…...
STM32 HAL库 UART通讯(C语言)
1、使能UART时钟和GPIO时钟(以USART1为例): __HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟(假设使用PA9/TX, PA10/RX) 2、GPIO配置: GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.P…...
【经验分享】Linux 系统安装后内核参数优化
在 Linux 系统安装后,进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作: 修改/etc/sysctl.conf 文件 执行sysctl -p使配置生效。 kernel.shmmax 135185569792 kernel.shmall 4294967296 fs.aio-max-nr 3145728 fs.fi…...
【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库
文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…...
【Java进阶打卡】JDBC-JDBC快速入门
【Java进阶打卡】JDBC-JDBC快速入门 概述快速入门 概述 快速入门 package com.itheima01;import java.sql.*;public class JDBC01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 导入jar包 项目文件下面 创建libs文件夹 该ja…...
CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)
1. 引言 在 CEF132(Chromium Embedded Framework)的编译过程中,depot_tools 扮演着举足轻重的角色。这套由 Chromium 项目精心打造的脚本和工具集,专门用于获取、管理和更新 Chromium 及其相关项目(包括 CEFÿ…...
缓存机制与 Redis 在高性能系统中的应用
引言 随着互联网应用日益增长,用户对系统的响应速度和稳定性提出了更高的要求。在高并发、大流量的场景下,数据库的读取压力会急剧上升,导致数据库的响应速度变慢,甚至引发性能瓶颈。为了缓解这一问题,缓存机制成为了…...
WinForm 防破解、反编译设计文档
一、引言 1.1 文档目的 本设计文档旨在阐述 WinForm 应用程序防破解、反编译的设计方案,为开发团队提供详细的技术指导,确保软件的知识产权和商业利益得到有效保护。 1.2 背景 随着软件行业的发展,软件破解和反编译现象日益严重。WinForm…...
晶闸管主要参数分析与损耗计算
1. 主要参数 断态正向可重复峰值电压 :是晶闸管在不损坏的情况下能够承受的正向最大阻断电压。断态正向不可重复峰值电压 :是晶闸管只有一次可以超过的正向最大阻断电压,一旦晶闸管超过此值就会损坏,一般情况下 反向可重复峰值电压 :是指晶闸管在不损坏的情况下能够承受的…...
基于Python的人工智能驱动基因组变异算法:设计与应用(上)
一、引言 1.1 研究目标与内容 本研究旨在设计并应用基于 Python 的人工智能驱动的基因组变异算法,以应对基因组学研究中日益增长的数据挑战,提高对基因组变异的理解和应用能力。主要研究内容包括: 数据预处理:利用 Python 的 Biopython、pandas 等库,对来自公共数据库(…...
自己部署DeepSeek 助力 Vue 开发:打造丝滑的标签页(Tabs)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 自己…...
Python+appium实现自动化测试
目录 一、工具与环境准备 二、开始测试 1、插上手机,打开usb调试,选中文件传输,我这里用华为手机为例 2、启动Appium Server GUI编辑 3、启动 Inspector Session 4、录制脚本 使用Python和Appium进行自动化测试是一种常见的移动应用…...
解锁大语言模型潜能:KITE 提示词框架全解析
大语言模型的应用日益广泛。然而,如何确保这些模型生成的内容在AI原生应用中符合预期,仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发:提示工程原理与实战》一书(京东图书:https://item.jd.com/1013604…...
GPT-SWARM和AgentVerse的拓扑结构和交互机制
GPT-SWARM和AgentVerse的拓扑结构和交互机制 拓扑结构区别 GPT-SWARM:采用图结构,将语言智能体系统描述为可优化的计算图。图中的每个节点代表一个操作,如语言模型推理或工具使用等特定功能,边则描述了操作之间的信息流,代表智能体之间的通信渠道。多个智能体连接形成的复…...
undetected-chromedriver 使用教程,指定浏览器驱动和浏览器版本
前言 浏览器自动化测试,测试过一些网站检测 目录 前言1. 安装 undetected-chromedriver2. 基本使用示例代码:代码解析: 3. 反自动化检测绕过自定义浏览器设置示例:使用自定义 User-Agent示例:启用无头模式(…...
cmake
一. 是什么 cmake是一个跨平台的构建工具。 跨平台:可以在linux,windows,macos中使用。 构建工具:cmake不直接参与编译,而是生成平台相应的构建工具。比如:linux下的makefile,windows下的.sln(解…...
Linux高并发服务器开发 第十七天(管道缓存区查询大小 管道的优劣 命名管道mkfifo 建立释放映射区mmap/munmap 匿名映射 进程间的通信)
目录 1.pipe管道读写行为 1.1例题:实现父子进程 ls | wc -l 1.2兄弟进程 ls | wc -l 2.管道缓存区 2.1命令查询 2.2函数查询 3.pipe管道的优劣 4.命名管道 fifo 5.mmap 5.1文件进程间通信 5.2建立、释放映射区 5.3匿名映射 6.进程间通信 6.1父子进间通…...
windows系统远程桌面连接ubuntu18.04
记录一下自己在配置过程中遇到的问题,记录遇到的两大坑: windows系统通过xrdp远程桌面连接ubuntu18.04的蓝屏问题。参考以下第一章解决。 同一局域网内网段不同的连接问题。参考以下第三章解决,前提是SSH可连。 1. 在ubuntu上安装xrdp 参考&…...
SQLMesh系列教程-2:SQLMesh入门项目实战(下篇)
上篇我介绍了环境搭建、duckdb数据准备、sqlmesh数据模型、plan命令运行。本文继续介绍审计、测试、生成血缘关系以及python模型等。 有两种方法可以在SQLMesh中创建宏。一种方法是使用Python,另一种方法是使用Jinja。这里我们创建Python宏。让我们构建简单的Python…...
ThinkPHP8视图赋值与渲染
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中,使用view函数可以传入视图…...
tkinter-TinUI-xml实战(12)应用组启动器
tkinter-TinUI-xml实战(12)应用组启动器 引言主界面单独条目 编辑框命令行指令子任务指令 演示题外话 引言 应用快捷启动器有很多现成软件,但是大多都是将常用软件分类,或者建立一个个包含一套工作、学习环境的软件类区ÿ…...
MySQL隐式转换介绍、常见场景和导致问题、示例代码
概述 MySQL 中的 隐式类型转换 是指在某些操作中,MySQL 会自动将数据的类型转换为另一种类型,以便完成操作。虽然这种特性在某些情况下很方便,但也可能导致性能问题、数据丢失或意外的查询结果。 1. 什么是隐式类型转换? 隐式类…...
Quartz定时任务
官网:http://www.quartz-scheduler.org/ OpenSymphony 开源组织在Job scheduling领域的一个开源项目,基于java实现的任务调度框架 设计模式:Builder模式、Factory模式、组件模式、链式编程 核心概念: 任务Job 想要实现的任务…...
【C++八股】静态局部变量/全局变量/局部变量的区别和使用场景
1. 静态局部变量 (Static Local Variable) 作用域:静态局部变量的作用域仅限于函数或代码块内部,就像普通局部变量一样,但其生命周期不同。生命周期:静态局部变量的生命周期是整个程序的运行期间,它只会在第一次调用时…...
飞算 JavaAI:加速 AI + 行业趋势的智能化进程
在数字化浪潮奔涌的当下,“AI 行业” 已然成为不可逆的发展趋势,各行业都在积极探索 AI 技术与自身业务的融合,期望借此实现创新突破与转型升级。在这一进程中,飞算 JavaAI凭借其卓越的技术实力和独特的功能优势,为加…...
【Elasticsearch入门到落地】7、文档操作
接上篇《6、索引库的操作》 上一篇我们学习了ElasticSearch的索引库的操作,以及mapping映射属性以及CRUD操作。本篇我们来学习文档的薪资、查询、删除和修改操作。 上一篇我们建立了索引库,库有了我们就可以往里面添加数据了,然后对文档进行…...
【算法】【双指针】acwing算法基础 2816. 判断子序列
题目 给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。 请你判断 a 序列是否为 b 序列的子序列。 子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。 输入格式 第一…...
【Unity3D】Jenkins Pipeline流水线自动构建Apk
目录 一、准备阶段 二、创建Pipeline流水线项目 三、注意事项 一、准备阶段 1、安装tomcat 10.0.5 Index of apache-local/tomcat/tomcat-10 2、安装jdk 17 Java Archive Downloads - Java SE 17.0.13 and later 3、下载Jenkins 2.492.1 (.war)包 War Jenkins Packa…...
Openssl的使用,CA证书,中间证书,服务器证书的生成与使用
证书教程 1、Openssl相关文档2、生成证书命令初步解释3、准备openssl的配置文件 openssl.cnf4、证书生成4.1、生成根证书、CA根证书、自签名证书4.2、生成服务器证书4.3、生成中间证书4.3、使用中间证书生成服务器证书5、使用openssl操作证书5.1 查看证书内容5.2 进行证书测试5…...
HCIA项目实践--静态路由的综合实验
八 静态路由综合实验 (1)划分网段 # 192.168.1.0 24#分析:每个路由器存在两个环回接口,可以把两个环回接口分配一个环回地址,所以是四个环回,一个骨干,这样分配,不会出现路由黑洞#19…...
VSCode中出现“#include错误,请更新includePath“问题,解决方法
1、出现的问题 在编写C程序时,想引用头文件但是出现如下提示: (1)首先检查要引用的头文件是否存在,位于哪里。 (2)如果头文件存在,在编译时提醒VSCode终端中"#include错误&am…...
鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)
文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同,业务逻辑不同2.2、类型1和类型2布局不同,但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…...