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

C++感受2-逐字逐句,深入理解C++最小例程

以 “Hello World” 例程为载体、线索,在完成 “间接名字空间限定” 写法转换到“直接名字空间限定”的过程,同时掌握函数、主函数、函数调用、级联操作、声明、类型、int、字符串类型、头文件包含、行为数据、流输出操作符、标准输出流对象、标准库名字空间、ADL等20多个C++知识点,打好基础,让后续的学习事半功倍。

 0. 视频

逐行逐句深入讲解cpp最小例程

1. 函数

1.1 基本概念

在编程语言中,函数通常用于表达“做事情”的概念,它需要描述清楚做事情的三个要素:

  1. 做事情的“初始材料”
  2. 做事情的“操作过程”
  3. 做事情的“返回结果”

“初始材料”指对在做事情之前,需要从调用者处得到的数据的描述;
“操作过程”指对做事情的完整过程描述;
“返回结果”指对做事情可能得到的结果的描述;

除此之外,函数还有一个重要的外在属性:调用者。函数对应做事情,有时为了把“大事化小”,需要将一件大事,拆分成多个小事,然后再由大事调用小事(此处的“大”和“小”仅为相对概念,有时候“小”事也可能调用“大”事)。比如:“妈妈炒菜”是一件事,对应一个函数,在炒菜过程中,如果发现家里没有酱油了,炒菜无法进行下去,此时可以调用另一件事所对应的函数:“小明打酱油”。在这一例子中,“小明打酱油”函数的调用者,即“妈妈炒菜”函数。

1.2 基本语法

除此之外,函数还需要有名字,四者的组成语法为:

返回结果类型 函数名 ( 所需初始材料声明 )
{操作过程描述;return 返回数据;
}

其中:

  • “所需材料声明” 整体上构造函数的参数表(也称参数列表);
  • return 语句用于结束函数的操作过程(简称结束函数), “return” 正是 “返回”的意思;
  • 当一个函数声明为必须有返回结果时,对应的 return 语句后面也必须带相应类型的数据。

1.3 函数头、函数声明

三要素中的“初始材料”描述和“返回结果”描述,再加上函数名字,构成了“函数头”。如在函数后面直接加分号(语句分隔符),称为该函数的声明,即:对函数的基本约定,形如:

返回结果类型 函数名 ( 形参表 ); 

函数声明只是对函数所要做的事的基本描述和约定。即:描述了这件事的“入”和“出”:“入”是指需要“拿到”什么初始数据(材料),“出”是指事情完成后,可能返回什么结果数据。

对于同一个函数,函数声明可以多次出现。因此函数声明可视为一个人的“名片”。
函数声明有时也称为“函数原型”,意为:这个函数“大概长什么样子”。

1.4 函数体、函数定义

函数体用于实现函数,它是函数头之后的一对花括号,花括号内是实现具体操作过程的代码。
函数头加函数体,即代表了一个函数的真实实现。以下是一个真实的C++函数定义例子:

int add(int a, int b)
{return a+b;
}

 它表示有一个函数,名为 “add”,它在执行之前,需要从调用者得到两个入参:a和b,二者的类型一个是整数类型,另一个也是整数类型。这个函数执行之后,也会返回(得到)一个整数数据。从实现上看,即返回 a+b 的结果。

一个函数应该只有一个真实实现,称为(函数的)定义。

2. 主函数

主函数可理解为:对应到整个程序需要做的那件“大事”。

主函数是一个特殊的函数。它的第一个特殊之处,即名字必须固定为 main,小写(C++代码区分大小写)。

主函数的第二个特殊之处,它的调用者是程序的外部运行环境,比如操作系统(但并不一定是操作系统,有些程序会运行在虚拟机内,也有些时候,程序由另一个程序调用)。

主函数之所以函数名需要固定,正是为了和外部环境,也就是它的调用是约定好:请将主函数视为程序的开始位置,因此主函数也时常被称为“入口函数”。

仅是“视为”,C++程序实际上仍然可以要求在进入主函数之前,就“偷偷”做点其它事情(通常用于准备工作)。

主函数也是函数,因此也需要考虑“初始材料”和“返回结果”。

既然调用者是外部运行环境,因此主函数如果需要获得初始材料,也是由外部运行环境传入,方法也正是主函数的参数列表。此处,主函数又有特殊之处,它的参数列表可以二选一:

  1. 不需要参数,即空的参数表;
  2. 需要参数,形如: (int argc, char* argv[]);
    我们在很长时间内,会仅使用第1种形式,因此暂不解释第2种形式。

C++主函数必须返回一个整数,因此在函数头中,需写明其返回数据的类型为整数类型,在C++中使用int(即 integer 缩写)。主函数返回的整数有以下含义:

  • 0:表示程序运行正常结束;
  • 非0:表示程序因出错而意外结束,各整数值可用于不同的错误编号。

在函数体中,主函数又有一个“特权”:可以不写任何 return 语句。该情况下表示该主函数永远执行正确,永远返回0。事实上,这个“特权”的背后,只是编译器在发现一个主函数没有返回语句时,就主动帮我们添加了 “return 0;” 而已。

再次强调:这是主函数的“特权”,其它函数如果在声明自己需要有返回值(哪怕返回的类型也是int)却不写(或忘记写) “return XXX;” 语句,会带来严重后果。

3. 认识“流”

上一节课我们所写的代码中,主函数的操作过程就句(事实上还有隐藏的一句“return 0;”):

cout << "Hello World" << endl;

3.1 cout - 标准输出流对象

这其中cout读作c-out,c 是 “character”,out 是 “output-device”,合起来意为“字符输出设备”,即 cout 对应者程序的输出屏幕。

当然,cout 仅用于windows下有控制台或linux/unix下拥有终端的程序,图形界面程序 GUI
的屏幕输出,有另外的实现机制。

由于C++的标准输入输出基于“流”的概念设计及实现,因此cout也称为C++的“标准输出流对象”。关于“流”的概念,本站《STL和boost之“流” 视频辅导》 课程有深入讲解。现在大家可以简单理解为,就像水流、电流一样,C++中的“流”就是将待输出或待输入的数据,排成一串,在某个“管道”中,按某个方向“流”动。

3.2 << - 流输出操作符

两个小于号组成的符号,称为C++的“流输出操作符”。
以小学所学的加号 + 类比:

  • 需要两个操作数、<< 也是;
  • 执行的操作是将左右两数相加,<< 执行的操作是将右边的数据,输出到左边的对象身上;
  • 的操作结果是相加之和那个数,<< 操作结果则是继续得到它左边的对象,在本例中,即 cout;
  • 支持级联操作,比如: 1+2+5,可先计算出 3,然后3继续参与计算: 3+5。<< 也支持级联操作: cout << "Hello World"后,得到的仍然是 cout,于是继续参与计算 cout << endl;

在C++中,操作符本质上也是一种函数。

3.3 endl - 操作控制符、“行为”数据

endl 也是一个函数,但此处我们将它当作数据使用,将它输出到 cout 身上。作用是将之前已经送到 cout 身上的数据,完完整整地送到真实的屏幕上,并加上换行。

每次往真实的显示屏幕上输出,比较耗性能(无关数据量);因此,为提高性能,输出的数据可能被cout对象“攒”起来,积累到一定程度再一次性真实输出。

3.4 ; - 语句分隔符(语句结束符)

在编辑器中,我们可以把一行的C++语句,拆成多行写,比如:

cout <<"Hello World"<< endl;

通常仅在这一语句确实很长时使用,上面的例子显然是在强行换行,不推荐。

 也可以将多个语句合成一行(这就很不推荐了):

cout << "Hello World" << endl; return -1;

对于简单的独立语句,C++编译器都是通过分号来分隔前后两行语句。注意,哪怕如本例中只有一行语句,也需要使用。

反过来,也并不是所有形式语句都需要分隔,后面将学习到复合语句,就是使用一对 {} 包含多行简单语句,此时 {} 就是天然的分隔。在本例中你可以将函数体的那一对花括号视为一种复合语句。

更不是所有代码行都需要语句分隔符。比如本例中的第一行:

#include <iostream>

深入区分的话,这是一行“预处理”代码,“预处理”是指在正式编译之前,先读一下代码做一些比较基础的准备工作,因此这些代码不被视为正式的C++语句,如此,这些代码也被硬性按格式要求书写,比如上面的 include 就只能写在一行,不能折行,下面是错误示例:

#include <iostream>

 

4 出处!出处!!出处!!!

和现实生活中一样,任何一件出处不明的物体,或者人物,都是危险的,所以请再看一眼代表做“大事情”的主函数代码:

int main()
{cout << "Hello World" << endl;
}

请问:cout 是谁? << 又是谁? endl 呢?这三个家伙来自哪里?也就是它们的可信出处是?
如果没有出处,严谨的C++编译器不会让这些代码通过编译;而,如果有出处,编译通过了,但程序执行后所要做的事,却不一定真的如我们前面辛苦解释那样的:往屏幕上输出一行对世界的问候——如果它们的出处是由“坏人”提供的话。

4.1 头文件 - 相关符号的统一出处

头文件就像家族族谱,或者松散一点,就像一个名片录或通讯录,可以记载许多符号(比如人名)的出处——在我们名片录或通讯录的人,确实比完全的陌生人,要安全那么一点点了。

#include <XXXX>

 这一行代码中 #include 是一种硬性规定,它是一行预编译代码,用于指示编译器:在你正式工作(正式开始编译当前源文件后续内容)之前,请先找到并打开XXXX文件(通常被称为“头文件”),读入其中的内容——因为这些内容对后续的编译工作有关键作用。

一对 <> 也是一种硬性规定,它进一步要求编译器:当你需要在电脑中成千上万的文件中搜索XXXX文件时,一!定!不!要!到!处!乱!翻!(怕你不小心翻到主人的各种学习资料),你只能在编译环境事情约定,或编译参数中配置好的文件夹里去寻找。

 

4.2 iostream 头文件

iostream 正是来自C++自带的标准库的一个头文件,主要是包含了和“流”相关的各种符号的声明。从字面上看:i 是 input / 输入 ,o 是 output / 输出,stream 就是 “流” 的英文单词。

iostream 正是包含我们在本例中用到的 cout 、<< 、endl 这三个符号的声明,于是这三者相当于了合法的出处:我们出自iostream文件,而后者出自C++自带的标准库,而当前机器上的C++标准库,就是你自己下载、安装到你的电脑上的。

当然,我们的课程用的是线上编程环境,因此iostream等文件,实际在网络所在后台服务器,我们当然也选择相信。

4.3 namespace 名字空间

代码中的各个符号(通常称为标识符)本质就是一个个名字,而一牵涉到名字,就和现实生活一样,会有重名的情况。C++可以“名字空间 / namespace”来避免重名,方法就是将所有相关的名字,统一放在一个“名字空间”内。正如视频所讲,学校中的每个班级,天生就是一个个名字空间,因此“三年一班的李国庆”和“四年二班的李国庆”就得以区分。

当然,这样的前缀,通常只需在两人出现在同一场合的情况下需要。另外,这也解决不了同一名字空间下的重名问题。

标准库也用到了大量的符号,并且它因为是“标准库”,所以就很霸道地占用了很多极为常用的符号名字,比如 “sort”、“find”、“search”、“string”、“begin”、“end”、“list” ……所以,标准库问世后,很快就给自己搞了一个名字空间:std (来自 standard)。

所以,前述的 cout、<<、endl,严格讲其实在 iostream 里声明的全称,解读起来应该是 std::cout、std::<<、std::endl。实际使用时,也应该用上这样的“全称”:

 std::cout std::<< "Hello World" std::<< std::end;

但是,为什么我们现在的代码:cout << “Hello World” << endl 可以编译并正确运行呢?这就是第三行代码的作用:

using namespace std;

它用来告诉编译器,如果在后面的代码,遇到实在找不到出处的符号,可以加上 std::再试试。以 cout 为例,当找不到它的出处时,可将它变成 std::cout 再尝试,于是就成功了。

4.4 关键字

并不是所有在代码中出现的符号都需要担心重名,C++语言(其它语言也一样)规定了一些特别重要的单词(符号)专门给自己使用,其他人(普通程序员)不能把这些单词随意拿作他用,自然,在如此“霸道”的规定下,这些单词就不会有重名的担心了。这样的单词就叫关键字/keyword。

本例中,int、using、namespace,以及被删除掉那一行的 return 都是C++的关键字,C++有近100个关键字。

iostream 则是用户(标准库作者)为文件取的名字,main也是(标准库)程序员为C++入口函数取的名字,std是标准库自用的名字空间的名字,它们要么来自标准库,要么是语言标准的硬性规定,显然我们在写代码时,为符号给的名字,还是尽量不要和它们重名的好。

4.5 直接名字空间限定

使用 using namespace XXX 的方法,称为“间接名字空间限定”,它会将XXX下的所有公开的符号名字,都引入当前代码下。这不是推荐的,名字空间的日常方法。我们的例程经常使用它,仅仅是因为我们的代码比较简单,而间接名字空间限定比较方便让代码行变短一些,从而有利于例程排版。

大多数情况下,我们推荐使用 “直接名字空间限定”的方法,下面就是使用这一方法的,新的Hello World 例程的完整代码:

#include <iostream>int main()
{std::cout << "Hello World" << std::endl;
}

此时,cout 和 endl 都被直接加上 std:: ,相当于有一个特殊的前缀,直接接明它们来自std这个名字空间,又直观又安全。

  • 直观:把 :: 读成 “的”,就有: “std的cout”及“std的endl”,有如生活中的 “三年一班的李国庆”。
  • 安全:“间接名字空间限定”是在某一符号出处查找失败,才尝试使用间接指定的某个名字空间去套用,自然就有“套用”结果不是程序员本意的意外可能。直接名字空间限定出这种错误的可能性近乎零。

​4.5 ADL - 实参依赖查找

眼尖的同学会发现,在直接名字空间限定的写法中:

std::cout << "Hello World" << std::endl;

这行代码,只是用std::限定了 cout 和 endl,<< 却没有限定。

事实上,因为 << 是一个操作符,如果写作 std::<< 反倒会编译失败。
这就涉及到了 ADL(Argument-dependent lookup)这一语法知识点,它与编译规则也紧密相关。

 简单地说,和现实生活中类似,操作的对象,往往可以反过来帮助推导出操作的实际出处。比如“打屁股”、“打酱油”和“打车”的操作都是“打”,但其实各自含义大不相同(放在《辞海》里的出处自然也不同)。我们,也就是人类是通过打的对象,也就是“屁股”、“酱油”、“车” 倒过来推导出各自前面的“打”的含义。

编译器也有这样的智慧,它们也可以依据操作对象,倒过来推导操作的出处。比如:看到 << 这个操作符,因为没有加名字空间直接限定——事实上操作符的日常使用语法,也规定了不允许为它加名字空间前缀——而找不到其出处,自然无法知道它对应的真实操作……但是,编译器很快发现 << 所要操作的对象中,std::cout 是明确的,于是会到 std 这个名字空间下查找 <<,这就找到了,发现它是标准库的流输出操作符。

相关文章:

C++感受2-逐字逐句,深入理解C++最小例程

以 “Hello World” 例程为载体、线索&#xff0c;在完成 “间接名字空间限定” 写法转换到“直接名字空间限定”的过程&#xff0c;同时掌握函数、主函数、函数调用、级联操作、声明、类型、int、字符串类型、头文件包含、行为数据、流输出操作符、标准输出流对象、标准库名字…...

RabbitMQ 面试题及答案整理,最新面试题

RabbitMQ的核心组件有哪些&#xff1f; RabbitMQ的核心组件包括&#xff1a; 1、生产者&#xff08;Producer&#xff09;&#xff1a; 生产者是发送消息到RabbitMQ的应用程序。 2、消费者&#xff08;Consumer&#xff09;&#xff1a; 消费者是接收RabbitMQ消息的应用程序…...

字节算法-链表翻转与变形

文章目录 题目与变形解法 题目与变形 字节一面中关于 K个一组链表反转 的题目变形。 K个一组链表反转。K个一组链表反转&#xff0c;链表尾不足K个的元素也需要反转。K个一组链表反转&#xff0c;但是从链表尾部开始反转。反转从位置 left 到位置 right 的链表节点 解法 四…...

十一、软考-系统架构设计师笔记-未来信息综合技术

1、信息物理系统技术概述 信息物理系统的概念 信息物理系统(Cyber-Physical Systems&#xff0c;CPS)通过集成先进的感知、计算、通信、控制等信息技术和自动控制技术&#xff0c;构建了物理空间与信息空间中人、机、物、环境、信息等要素相互映射、适时交互、高效协同的复杂系…...

非同源点云尺度对齐及点云配准(cloudcompare软件)

1.点云裁减与尺度缩放 发现口扫stl转为的点云尺度是原始点云的1000倍 打开meshlab&#xff0c;通过“Filters” > “Mesh Layer” > “Transform: Scale”缩放1000倍&#xff0c;得到以米为单位的真实尺寸 此时在meshlab中进行点云手动裁减后效果 将ply文件转为xyz文件…...

体检业务数字化管理平台,健康体检管理系统(PEIS)源码

健康体检管理系统&#xff08;PEIS&#xff09;源码&#xff0c;自动生成体检报告&#xff0c;提供查询、统计和分析功能 健康体检管理系统&#xff08;PEIS&#xff09;可以建立完整的健康档案&#xff0c;系统实现了与HIS系统的无缝连接&#xff0c;着重于临床信息系统的应用…...

【SpringCloud微服务实战04】Nacos 配置中心

一、Nacos配置添加 二、Nacos配置读取 1、引入Nacos的配置管理客户端依赖&#xff1a; <!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</arti…...

无雀新功能宣传板之视频直播+Teambition

1. 今日新功能 钉钉视频会议新功能 视频会议功能&#xff0c;打造了一系列独具特色的通话海报模板供用户选择。其中引人瞩目的是为龙年限定的新春主题通话海报&#xff0c;它巧妙地融入了中国传统文化元素&#xff0c;将庄重且喜庆的龙年新春气息浓缩在画面之中。 自定义通话…...

学生选课系统的最简逻辑--一个学生选一门课

需求&#xff1a;设计一个学生选课系统&#xff0c;要求如下&#xff1a;有一个学生类&#xff0c;有一个课程类&#xff0c;还有一个Teacher类。。学生类包括姓名、学号、已选课程。课程类包括课程名称、授课老师属性。 老师包括老师的名字、老师的电话&#xff0c;老师的课程…...

波司登高德康:以有“韧性”的创新应变市场新浪潮

伴随着消费升级&#xff0c;羽绒服市场需求日益旺盛。愈发多元化的需求对于企业发展也有着更高的要求。如何更好推动行业多元化发展&#xff0c;可以从波司登的品牌升级、产品创新、模式创新、数字技术创新、绿色发展创新等方面窥得一二。 高德康总裁接受新华网主持人采访 对此…...

装饰你的APP:使用Lottie-Android创建动画效果

1. Lottie-Android简介 Lottie-Android是一个强大的开源库,由Airbnb开发,旨在帮助开发者轻松地在Android应用中添加高质量的动画效果。它基于Adobe After Effects软件中的Bodymovin插件,通过解析导出的JSON文件来渲染并播放复杂的矢量动画。 Lottie-Android提供了许多令人…...

成都爱尔林江院长解析巩膜镜是什么?它适合哪些人群

巩膜镜&#xff0c;全称为硬性透氧性巩膜接触镜&#xff0c;它有着特殊设计&#xff0c;大直径镜片像桥梁一样呈拱形覆盖角膜及角巩膜缘&#xff0c;从角膜上方横跨而过完全无接触、无任何机械性摩擦&#xff0c;最终贴合于巩膜。 巩膜镜的作用原理 光学成像&#xff1a; 配戴…...

苹果cms模板保护设置,防止被扒

苹果cms模板保护设置&#xff0c;防止被扒 如今互联网时代&#xff0c;网站模板前端被扒是常有的事&#xff0c;如何防止模板数据被扒&#xff1f; 保护设置方法&#xff1a; 登录宝塔 找到安装模板的网站 设置禁止访问文件 方法参考截图后缀填&#xff1a;php|html 目录填&a…...

Claude3、GPT-4、Gemini、Sora VS :谁将成为下一代科研利器?

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…...

vue 函数防抖

背景 一个页面使用监听器&#xff0c;监听了页面的三个参数&#xff0c;页面初始化的时候&#xff0c;三个参数都发生了变化。发送了三次请求&#xff0c;页面却使用的是第二次请求的数据。希望短时间内发生多次变化的时候&#xff0c;只发送一次请求 思路 这个需求可以通过使用…...

WordPress建站入门教程:如何创建菜单和设置前端导航菜单?

前面我们跟大家分享了WordPress如何上传安装WordPress主题&#xff0c;但是启用主题后前端没有看到有导航菜单&#xff0c;这是因为我们还没有创建菜单和设置导航菜单。 JianYue主题导航菜单和右上角菜单 今天boke112百科就继续跟大家分享WordPress站点如何创建菜单和设置前端…...

Rust:为 Trait 定义默认的方法

当你提到“指定 trait 的实现”并使用 :: 符号时&#xff0c;你可能是指在某些情况下&#xff0c;你想直接通过 trait 而不是具体的类型来调用方法。这在 trait 提供了默认方法实现时尤其有用&#xff0c;因为你可以不依赖任何具体的类型实现来调用这些方法。 然而&#xff0c…...

掌握Redis,看完这篇文章就够了

一&#xff0c;数据库的配置 内存数据库 MySQL与mongodb都是以文件的形式存储在磁盘上的 redis数据在内存中&#xff0c;操作内存的速度远远高于磁盘并且redis数据最终也可以存储在磁盘上 redis的存储结构为简直存储数据库类似于python中的字典的存储方式 redis的服务器与客户…...

烟火识别检测摄像头-火焰烟雾智能检测预警系统---豌豆云

火焰烟雾智能检测预警系统利用现场已有的监控摄像头&#xff0c;火焰烟雾智能检测预警系统对监控区域内的烟雾和火焰进行识别。 这种识别技术不仅准确率高&#xff0c;而且速度快&#xff0c;能够在短时间内对大量的视频数据进行处理和分析。 同时&#xff0c;该系统还能够动…...

js【详解】Promise

为什么需要使用 Promise &#xff1f; 传统回调函数的代码层层嵌套&#xff0c;形成回调地狱&#xff0c;难以阅读和维护&#xff0c;为了解决回调地狱的问题&#xff0c;诞生了 Promise 什么是 Promise &#xff1f; Promise 是一种异步编程的解决方案&#xff0c;本身是一个构…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...