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

C++编程语言:从高效系统开发到现代编程范式的演进之路

目录

  • 前言
  • 一、c++简介
  • 1.1 起源
  • 1.2 c++的特点 
  • 二、开发环境搭建 
  • 2.1. 安装 Qt 开发工具
  • 2.2 修改编码环境 
  • 2.3创建第一个 Qt 项目
  • 2.4 c++的编译过程
  • 2.5 代码示例 
  • 2.6 qt疑难杂症 
  • 2.6.1 遇到无法删除代码,一点击光标就变成小黑块
  • 2.6.2 遇到运行不弹出终端 
  • ​编辑 
  • 2.6.3 遇到终端有乱码
  • 三、词法符号
  • 3.1 关键字
  • 3.1.1 ANSI C 32个关键字
  • 3.1.2 C++ 补充的29个关键字
  • 3.2 标识符 
  • 3.3 运算符 
  • 3.3.1 算术运算符
  • 3.3.2 关系运算符
  • 3.3.3 赋值运算符
  • 3.3.4 逻辑运算符
  • 3.3.5 位运算符
  • 3.3.6运算符优先级(从高到低)
  • 3.4 分隔符
  • 3.5 标点符号 
  • 四、变量 
  • 4.1 格式
  • 4.1.1 数据类型
  • 4.2 变量赋值
  • 4.3 局部变量与全局变量
  • 4.4 内存分配
  • 五、常量
  • 5.1 整型常量
  • 5.2 浮点常量
  • 5.3 字符常量
  • 5.4字符串常量
  •  六、输入输出
  • 6.1 基础准备
  • 6.2 输出语句 cout
  • 6.3 输入语句 cin
  • 6.4 综合示例
  • 6.5 注意事项
  • 6.6 输入输出流程图示
  • 七、控制语句
  • 7.1 分支语句 - if/else
  • 7.1.1 特性
  • 7.1.2 完整示例:成绩分级
  • 7.2. 分支语句 - switch/case
  • 7.2.1. 格式
  • 7.2.2. 特性
  • 7.2.3 示例说明
  • 7.3 循环语句-for
  • 7.3.1 基本语法结构
  • 7.3.2执行顺序
  • 7.3.3 示例代码分析 
  • 7.3.4 关键特性
  • 7.3.5 常见用法
  • 7.3.6 练习:用for实现1-10求和
  • 7.4 循环语句-while
  • 7.4.1基本语法
  • 7.4.2 示例
  •  7.5 循环语句-do/while
  •  7.5.1语法结构
  • 执行顺序
  • 7.5.2 与 while 循环的关键区别
  • 7.5.3 示例代码分析
  • 输出结果
  • 7.6 练习题 
  • 七、数组
  • 8.1 定义
  • 8.2 特点
  • 8.3 声明格式
  • 8.4 初始化
  • 8.5 字符数组
  • 初始化方式:
  • 关键区别:
  • 8.6 练习:斐波那契数列逆序输出 
  • 九、指针
  • 9.1 概念
  • 9.2 定义格式
  • 9.3 核心运算符
  • 9.4 指针运算
  • 9.4.1 赋值运算
  • 9.4.2 算术运算
  • 9.4.3 关系运算
  • 9.5 练习
  • 总结

前言

C++ 是一种通用的、高效的编程语言,由 Bjarne Stroustrup 于 1980 年代在贝尔实验室开发,最初作为 C 语言的扩展(最初称为“C with Classes”)。它结合了 低级内存操作(如 C 语言)和 高级抽象特性(如面向对象编程),广泛应用于系统开发、游戏引擎、嵌入式系统和高性能计算等领域。


一、c++简介

1.1 起源

C++ 的起源可以追溯到 20 世纪 80 年代初,由丹麦计算机科学家 Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在 贝尔实验室(Bell Labs)开发。其设计初衷是结合 C 语言的高效性面向对象编程(OOP) 的特性,同时解决当时其他语言在系统编程中的局限性。

  1. C with Classes(1979–1983)

    • Stroustrup 最初将新语言称为 “C with Classes”,目的是在保留 C 语言底层控制能力的同时,引入 类(class)继承 和 多态 等面向对象特性。
    • 他受到 Simula(面向对象鼻祖)和 ALGOL 等语言的影响,但认为这些语言在性能和灵活性上无法满足系统编程需求。
  2. 正式命名为 C++(1983)

    • 1983 年,语言更名为 C++,名称中的 ++ 是 C 语言中的自增运算符,象征对 C 的改进和扩展。
    • 新增特性包括 虚函数运算符重载引用 和 常量(const 等。
  3. 首个商业版本(1985)

    • 1985 年,C++ 的第一个商业编译器 Cfront 发布,同时 Stroustrup 出版了经典著作《The C++ Programming Language》,成为语言的重要参考。
  4. 标准化进程(1998–至今)

    • 1998 年:首个国际标准 ISO/IEC 14882:1998(C++98)发布,确立了语言的核心规范。
    • C++11(2011):里程碑式更新,引入 自动类型推导(autoLambda 表达式右值引用 等现代特性。
    • 后续版本:C++14、C++17、C++20 持续增强功能,如 模块化(Modules)协程(Coroutines) 和 概念(Concepts)

1.2 c++的特点 

1. 多范式支持

  • 面向对象编程(OOP):支持类、封装、继承、多态(包括虚函数和抽象类)等特性。
  • 泛型编程:通过模板(Template)实现,支持类型无关的代码复用(如STL容器和算法)。
  • 过程化编程:保留C语言的特性,支持函数和模块化设计。

2. 高性能与底层控制

  • 直接内存操作:支持指针、手动内存管理,适合系统级开发。
  • 编译型语言:代码直接编译为机器码,运行效率接近底层硬件。
  • 资源敏感优化:支持内联汇编、寄存器变量等,适用于游戏引擎、高频交易等领域。

3. 标准模板库(STL)

  • 丰富的数据结构与算法:如vectormapsort等,提供高效实现。
  • 迭代器模式:统一访问容器元素的接口,增强代码通用性。
  • 函数对象与Lambda:支持函数式编程风格(C++11起)。

4. 内存管理

  • RAII(资源获取即初始化):通过对象生命周期自动管理资源(如文件句柄、内存),避免泄漏。
  • 智能指针:如unique_ptrshared_ptr(C++11引入),减少手动内存管理错误。

5. 现代语言特性(C++11及后续标准)

  • 自动类型推导auto关键字简化代码。

  • 移动语义与右值引用:避免不必要的拷贝,提升性能(如std::move)。

  • Lambda表达式:支持匿名函数,便于编写回调和高阶函数。

  • 并发支持std::thread、原子操作等标准库工具。

6. 灵活性与复杂性

  • 运算符重载:自定义类型支持运算符(如+<<),增强可读性。

  • 多重继承与虚基类:允许复杂对象关系,但需谨慎使用。

  • 模板元编程:编译时计算与类型推导,用于高性能库开发(如Boost)。

7. 兼容性与可移植性

  • 与C语言兼容:可直接调用C库,复用现有代码。

  • 跨平台支持:主流操作系统和硬件均有编译器(如GCC、Clang、MSVC)。

8. 静态类型系统

  • 编译时类型检查:提前发现类型错误,增强安全性。

  • 强类型约束:减少隐式类型转换的风险。

9. 异常处理

  • try/catch机制:支持错误处理,但部分场景推荐使用返回值或错误码。

10. 持续演进

  • 标准更新:每三年发布新标准(如C++20引入模块、概念约束),逐步简化语法并增强功能。


二、开发环境搭建 

2.1. 安装 Qt 开发工具

Windows 平台

  1. 下载 Qt 安装程序:

    • 访问 Qt 官网
    • 选择 "Download the Qt Online Installer"
  2. 运行安装程序:

    • 选择组件(至少选择 Qt 版本和 Qt Creator)
    • 推荐安装 MinGW 工具链(如果使用 MSVC 则需要安装 Visual Studio)
  3. 安装完成后,Qt Creator 将自动安装


2.2 修改编码环境 

修改默认编码


2.3创建第一个 Qt 项目

  1. 选择 "文件" > "新建文件或项目"
  2. 设置项目名称和路径
  3. 选择构建套件
  4. 完成向导后,点击 "运行" 按钮编译并执行程序

2.4 c++的编译过程

C++是一种典型的编译型语言,其代码执行需要经过完整的编译和链接过程。首先,程序员编写的源代码(.cpp/.h文件)会被编译器(如GCC、Clang或MSVC)进行词法分析、语法分析和语义检查,通过后生成与平台相关的目标文件(.o或.obj文件),该文件包含机器码和符号表但尚未解决外部依赖。接着,链接器将多个目标文件与库文件进行整合,解析函数和变量的引用关系,完成地址重定位,最终生成可执行文件(如Windows的.exe或Linux的.out)


2.5 代码示例 

// 引入输入输出流库,提供基本的输入输出功能
// iostream 包含标准输入输出对象如 cin, cout, cerr, clog 等
#include <iostream>// 使用标准命名空间 std
// 这样可以直接使用 std 中的成员(如 cout, endl)而无需前缀 std::
using namespace std;// 主函数,程序执行的入口点
// 每个C++程序必须有且仅有一个 main 函数
// int 表示该函数返回一个整数值
int main()
{// cout 是标准输出流对象,用于向控制台输出数据// << 是流插入运算符,用于将右侧的内容插入到左侧的流中// "Hello World!" 是要输出的字符串常量// endl 是特殊操作符,表示换行并刷新输出缓冲区// 这行代码会在控制台输出 "Hello World!" 并换行cout << "Hello World!" << endl;// return 语句结束 main 函数的执行// 返回 0 表示程序正常退出(非0值通常表示错误)// 在大多数操作系统中,0 表示成功,非0表示各种错误代码return 0;
}

2.6 qt疑难杂症 

2.6.1 遇到无法删除代码,一点击光标就变成小黑块

千万不要选这个!!!

取消勾选!!!


2.6.2 遇到运行不弹出终端 

改成启用

取消勾选! 

 


2.6.3 遇到终端有乱码

 辣鸡qt,该问题暂未解决,留待未来更新文章


三、词法符号

3.1 关键字

3.1.1 ANSI C 32个关键字

1. 存储类型

  • auto:自动变量(默认属性,通常省略)

  • extern:声明外部全局变量或函数

  • static:静态变量(作用域限制或持久化存储)

  • register:建议编译器将变量存储在寄存器中(现代编译器自动优化)

2. 数据类型

  • 基本类型charintfloatdouble

  • 修饰符

    • 长度:shortlong

    • 符号性:signedunsigned

  • 空类型void(用于函数返回值、指针、参数占位)

3. 控制语句

  • 条件分支ifelseswitchcasedefault

  • 循环控制forwhiledobreakcontinue

  • 跳转gotoreturn

4. 构造数据类型

  • struct:结构体(组合不同类型的数据)

  • union:共用体(共享内存空间的不同数据类型)

  • enum:枚举(定义命名常量集合)

5. 其他关键字

  • const:常量(值不可修改)

  • sizeof:计算变量或类型的内存大小

  • typedef:为类型定义别名

  • volatile:禁止编译器优化(用于硬件寄存器等场景)


3.1.2 C++ 补充的29个关键字

1. 数据类型增强

  • bool:布尔类型(值为 true/false

  • wchar_t:宽字符类型(Unicode支持)

2. 面向对象

  • class:定义类

  • private/protected/public:访问权限控制

  • friend:友元(允许非成员访问私有成员)

  • virtual:虚函数(实现多态)

  • this:指向当前对象的指针

3. 动态内存管理

  • new:动态分配内存

  • delete:释放动态内存

4. 模板与泛型编程

  • template:定义模板

  • typename:声明模板中的类型参数

5. 异常处理

  • try:异常检测代码块

  • catch:捕获并处理异常

  • throw:抛出异常

6. 运算符与函数特性

  • operator:运算符重载

  • inline:内联函数(减少函数调用开销)

7. 命名空间与别名

  • namespace:定义命名空间(避免命名冲突)

  • using:引入命名空间或定义类型别名

8. 其他

  • mutable:允许在const成员函数中修改成员变量

  • explicit:禁止隐式类型转换(构造函数)


3.2 标识符 

  1. 组成字符
    标识符只能由字母(A-Z, a-z)、数字(0-9)和下划线(_)组成,不允许其他特殊字符(如$@、空格等)。

  2. 首字符限制
    第一个字符必须是字母或下划线,不能是数字。

  3. 关键字冲突
    标识符不能与C语言的关键字(如intifreturn等)或保留标识符(如_Bool_Alignas等)相同。不同C标准(C89/C99/C11)的关键字可能不同,需注意兼容性。

  4. 区分大小写
    C语言严格区分大小写,例如varVarVAR是三个不同的标识符。

  5. 保留标识符

    • 双下划线(__)开头单下划线后跟大写字母(如_A的标识符保留给编译器或标准库使用(如__LINE___STDC__)。
    • 标准库函数名(如printfmalloc)和类型名(如size_tFILE)也应避免使用。

3.3 运算符 

3.3.1 算术运算符

运算符名称说明
+加法数值相加或字符串拼接
-减法数值相减
*乘法数值相乘
/除法整数除法截断小数(非向下取整),浮点数除法保留小数。如:5/2=2,5.0/2=2.5
%取模取余数(结果符号与被除数一致)。如:7%3=1,-7%3=-1
++自增++a(先自增后使用),a++(先使用后自增)
--自减同自增逻辑

3.3.2 关系运算符

运算符名称说明
>大于比较数值大小
>=大于等于
<小于
<=小于等于
==等于基本类型比较值,对象比较引用地址
!=不等于

3.3.3 赋值运算符

运算符名称说明
=赋值右侧值赋给左侧变量
+=加后赋值a += 5等价于a = a + 5
-=减后赋值
*=乘后赋值
/=除后赋值
%=取模后赋值

3.3.4 逻辑运算符

运算符名称说明
&&逻辑与短路特性:左假则跳过右操作
``
!逻辑非取反布尔值
&非短路与两侧均执行
``非短路或

3.3.5 位运算符

运算符名称说明
&按位与两操作数位同为1时结果为1
``按位或
^按位异或两操作数位不同时结果为1
~按位取反单目运算符,0变1,1变0
<<左移高位丢弃,低位补0(等价乘2)
>>带符号右移正数补0,负数补1(等价除2,向下取整)
>>>无符号右移高位补0(负数会变正)

3.3.6运算符优先级(从高到低)

  1. ()[].
  2. ++--!~
  3. */%
  4. +-
  5. <<>>>>>
  6. >>=<<=
  7. ==!=
  8. &^|
  9. &&||
  10. ?:(三元运算符)
  11. =+=-=等赋值运算符

3.4 分隔符

空白字符包括:空格符( )、制表符(\t)、换行符(\n)。
它们在代码中的作用是 分隔语法单元,但不同语言对空白符的敏感度不同。

空白字符类型作用场景示例
空格符分隔变量名、运算符、关键字等int a = 5;
制表符缩进代码块(Python强制要求)Python中:if x:\n\tprint(x)
换行符表示语句结束或代码块分隔(如C/Java的分号)JavaScript中自动分号插入规则


3.5 标点符号 

1. 逗号 ,

  • 变量声明分隔int a = 1, b = 2;

  • 函数参数分隔void func(int x, float y);

  • 表达式分隔(逗号运算符):int c = (a++, b++);(按顺序执行)

  • 初始化列表std::vector<int> v = {1, 2, 3};

2. 分号 ;

  • 语句结束符int a;a = 10;

  • 控制结构结束if (cond) { ... };(注意:if 后的代码块不需要分号)

  • 类/结构体定义结束class MyClass {};(必须加分号)

  • do-while 循环结束do { ... } while (cond);

3. 冒号 :

  • 类继承class Derived : public Base {};

  • 成员初始化列表MyClass() : m_value(0) {}

  • 标签语句label: ... goto label;

  • 三目运算符condition ? a : b

  • 作用域限定符(C++11):enum class Color : int { Red, Green };

4. 花括号 {}

  • 代码块作用域if (cond) { ... }

  • 类/结构体/枚举定义struct Point { int x; int y; };

  • 初始化列表int arr[] = {1, 2, 3}; 或 std::vector<int> v{1, 2, 3};

  • Lambda 表达式(C++11):auto f = []() { ... };

5. 圆括号 ()

  • 函数调用/声明func();void func(int param);

  • 表达式优先级int c = (a + b) * 2;

  • 类型转换float f = (float)3.14;(C 风格)或 static_cast<float>(3.14);

  • 条件/循环结构if (cond) { ... }while (cond) { ... }

6. 中括号 []

  • 数组声明/访问int arr[5];arr[0] = 10;

  • Lambda 捕获列表(C++11):[&]() { ... }(捕获外部变量)

  • 下标运算符重载T& operator[](int index);

  • 属性说明符(C++11):[[nodiscard]] int func();


补充标点符号

7. 尖括号 <>

  • 模板参数std::vector<int> v;

  • 头文件包含#include <iostream>

8. 双冒号 ::

  • 作用域解析std::coutMyClass::staticMethod()

  • 全局命名空间::globalVar

9. 点 . 和箭头 ->

  • 成员访问obj.memberptr->member

10. 双引号 "" 和单引号 ''

  • 字符串字面量"Hello"

  • 字符字面量'A'

11. 反斜杠 \

  • 转义字符\n(换行)、\"(双引号)

12. 波浪号 ~

  • 析构函数~MyClass() {}

13. 问号 ?

  • 三目运算符condition ? true_expr : false_expr


四、变量 

4.1 格式

[存储类型] 数据类型 变量名;
  • 存储类型:决定变量的存储位置和生命周期(如 autostaticregisterextern
  • 数据类型:决定变量占用的内存大小和值域范围
  • 变量名:需符合标识符规则(字母/下划线开头,不含空格,区分大小写)

4.1.1 数据类型

类型名称字节大小值域范围说明
char1-128 ~ 127ASCII字符
unsigned char10 ~ 255
short2-32,768 ~ 32,767
unsigned short20 ~ 65,535
int4-231 ~ 231-1默认整数类型
unsigned int40 ~ 4,294,967,295
long4/8-231 ~ 231-1 或 -263 ~ 263-1依赖系统架构
unsigned long4/80 ~ 232-1 或 264-1
float4约6-7位有效数字单精度浮点数
double8约15-16位有效数字双精度浮点数
bool1false(0)/true(1)C++新增,需包含头文件
std::string24-40*动态字符串C++类类型,需#include <string>

4.2 变量赋值

初始化方式

  1. 传统赋值
    int a = 100;
    char ch = 'A';  // 单引号表示字符
  2. 构造函数式
    float ft(3.14f);
  3. C++11统一初始化
    double dbl{3.1415926};  // 禁止窄化转换
    std::string s{"Hello"};

4.3 局部变量与全局变量

特性局部变量全局变量
定义位置函数或代码块内部所有函数外部
存储区域栈区(自动分配/释放)全局区(程序启动到结束存在)
作用域当前代码块整个程序
生命周期代码块执行期间程序运行期间
默认值未初始化时为随机值自动初始化为零

4.4 内存分配

  1. 栈区

    • 自动管理,存放局部变量、函数参数。
    • 大小有限(默认约1-8MB),快速分配。
  2. 堆区

    • 手动管理(new/delete),存放动态对象。
    int* ptr = new int(100);  // 分配堆内存
    delete ptr;               // 释放内存
  3. 全局/静态区

    • 存放全局变量、静态变量(static)、常量。
  4. 常量区

    • 存放字符串常量和const常量。

五、常量

5.1 整型常量

  • 表示方式

    • 十进制:普通数字,如 123-45
    • 八进制:以 0 开头,如 0123(十进制83)。
    • 十六进制:以 0x 或 0X 开头,如 0x1A(十进制26)。
    • 二进制:以 0b 或 0B 开头(C++14起支持),如 0b1010(十进制10)。
  • 类型与后缀

    • 默认类型为 int,具体大小由编译器决定。
    • 后缀
      • u 或 U:无符号类型(如 123U 为 unsigned int)。
      • l 或 Llong 类型(如 123L)。
      • ll 或 LLlong long 类型(如 123LL)。
      • 可组合使用,如 0x1AULLunsigned long long)。

5.2 浮点常量

  • 表示方式

    • 小数形式:必须包含小数点或指数部分,如 3.140.5100.0
    • 科学计数法:用 e 或 E 表示指数,如 1.2e3(1200)、5E-2(0.05)。
  • 类型与后缀

    • 默认类型为 double
    • 后缀
      • f 或 Ffloat 类型,如 3.14f
      • l 或 Llong double 类型,如 3.14L

5.3 字符常量

  • 表示方式

    • 用单引号 '' 包裹,如 'A''5''#'
    • 转义字符:用于特殊符号,常见转义序列:
      • \n:换行,\t:制表符,\\:反斜杠。
      • \':单引号,\":双引号,\0:空字符。
  • 宽字符

    • 前缀 L 表示宽字符(wchar_t 类型),如 L'中'
  • 注意事项

    • 字符常量只能包含单个字符,多字符(如 'ab')可能导致编译器警告或未定义值。

5.4字符串常量

  • 表示方式

    • 用双引号 "" 包裹,如 "Hello""C++"
    • 隐式以 \0(空字符)结尾,例如 "a" 存储为 'a' 和 '\0'
  • 存储方式

    • C风格字符串const char[] 类型,如 const char* str = "Hello";
    • C++ string类std::string 类型,需包含 <string> 头文件。
  • 特性

    • 拼接:相邻字符串自动连接,如 "Hello" " World" 等价于 "Hello World"
    • 原始字符串(C++11):用 R"(...)" 避免转义,如 R"(Path: C:\Users\)"
  • 注意事项

    • 不可修改字符串字面量,如 char* s = "abc"; s[0] = 'x'; 会导致未定义行为。
    • 使用 char[] 初始化时可自动添加 \0,如 char arr[] = "abc";(长度为4)。
#include <iostream>  // 包含输入输出流库,用于使用cout和endl
using namespace std; // 使用标准命名空间,避免重复写std::int main() // 主函数,程序入口
{// 用char类型存储单个字符,使用单引号包裹char st = 'a'; // 声明并初始化一个字符变量st,值为'a'// 字符串可以用字符数组或string类型存储// 字符数组:需预留空间存放结尾的'\0'空字符char arr[5] = "abc"; // 声明大小为5的字符数组,初始化为"abc"(实际占用4个元素:a,b,c,\0)// 数组剩余位置自动填充为'\0'string str = "hello"; // 使用string类存储字符串,无需手动管理内存和大小cout << arr << endl; // 输出字符数组arr,遇到'\0'停止cout << str << endl; // 输出string字符串,自动处理内存和长度return 0; // 返回0表示程序正常退出
}

 六、输入输出

6.1 基础准备

#include <iostream>  // 必须包含的头文件
using namespace std; // 使用 std 命名空间(或显式写 std::cout)

6.2 输出语句 cout

  • 作用:向标准输出设备(如屏幕)发送数据。
  • 运算符<<(插入运算符),可连续拼接多个数据。
  • 换行控制:使用 endl 或 "\n"

示例代码

int age = 25;
cout << "Hello, World!" << endl;   // 输出字符串后换行
cout << "Age: " << age << "\n";   // 拼接变量和字符串,用 \n 换行

6.3 输入语句 cin

  • 作用:从标准输入设备(如键盘)读取数据。
  • 运算符>>(提取运算符),按顺序提取数据到变量。
  • 特性:自动跳过空白符(空格、制表符、换行)。

示例代码

int num;
double score;
cout << "Enter a number and a score: ";
cin >> num >> score;  // 连续输入多个值,用空格分隔

6.4 综合示例

#include <iostream>
using namespace std;
int main() {string name;int age;cout << "Enter your name: ";cin >> name;                   // 输入字符串(遇到空格停止)cout << "Enter your age: ";cin >> age;                    // 输入整数cout << "Name: " << name << "\nAge: " << age << endl;return 0;
}

6.5 注意事项

  1. 命名空间:若未写 using namespace std;,需显式使用 std::cout 和 std::cin
  2. 数据类型匹配:输入时必须确保变量类型与数据一致,否则会导致错误状态。
    int x;
    cin >> x;  // 若用户输入非数字,x 将保留随机值,cin 进入错误状态
  3. 读取含空格的字符串cin >> name 遇到空格会停止,需用 getline 读取整行:
    string fullName;
    cout << "Enter full name: ";
    cin.ignore();                   // 清除之前输入残留的换行符
    getline(cin, fullName);         // 读取整行(包括空格)

6.6 输入输出流程图示

键盘输入 -> [cin] >> 变量       // 提取数据到变量
变量     -> [cout] << 屏幕显示  // 插入数据到输出流

掌握 cincout 是 C++ 交互的基础,后续可结合格式控制(如 <iomanip> 中的 setwsetprecision)进行更复杂的操作。


七、控制语句

7.1 分支语句 - if/else

基本语法

if (表达式) {语句块1;
} else {语句块2;
}

7.1.1 特性

  1. if-else关系

    • if可以单独存在,但else必须对应一个if
    • else必须紧跟最近的未匹配的if,中间不能插入其他代码。
  2. 代码块与作用域

    • 若省略大括号{}if/else仅控制紧随其后的一条语句。
      示例:
    if (num > 0)cout << "正数";  // 仅此句属于if
    elsecout << "非正数"; // 仅此句属于else

7.1.2 完整示例:成绩分级

练习:从终端输入一个学生的成绩,判断学生成绩并打印成绩级别(使用if语句)

【90 - 100】 A

【80 - 89】 B

【70 - 79】 C

【60 - 69】 D

< 60 sorry you lost

#include <iostream>
using namespace std;
int main() {int score;cout << "请输入成绩(0-100): ";cin >> score;// 输入验证if (score < 0 || score > 100) {cout << "错误:成绩超出有效范围!" << endl;return 1;}// 分级判断if (score >= 90) {cout << "A" << endl;} else if (score >= 80) {cout << "B" << endl;} else if (score >= 70) {cout << "C" << endl;} else if (score >= 60) {cout << "D" << endl;} else {cout << "Sorry, you lost." << endl;}return 0;
}

7.2. 分支语句 - switch/case

7.2.1. 格式

switch(表达式) 
{case 常量1:语句块1;break;case 常量2:语句块2;break;// 更多 case...default:语句块n;break;
}

7.2.2. 特性

  1. 表达式类型限制

    • 表达式必须为 整型(如 intchar)或 枚举类型,不能为浮点类型(如 floatdouble)或字符串(如 char*、字符串字面量)。
  2. case 标签规则

    • case 后的常量必须是 整型常量表达式,且值唯一,不可重复。
    • 不允许使用变量或运行时计算的表达式。
  3. break 的作用

    • 每个 case 后通常需添加 break,否则程序会继续执行下一个 case 的语句块(称为 穿透效应)。
    • 利用穿透效应可合并多个 case 执行同一逻辑,但需明确注释以避免误解。
  4. default 分支

    • default 分支可选,用于处理未匹配的所有情况。
    • default 后的 break 可省略(若位于末尾),但若其后有其他 case,需谨慎处理穿透问题。
    • default 可置于任何位置,但通常放在末尾以提高可读性。
  5. 执行流程

    • 从匹配的 case 处开始执行,直至遇到 break 或 switch 结束。
    • 若无匹配 case 且存在 default,则执行 default 分支。

7.2.3 示例说明

int x = 2;
switch(x) {case 1:printf("One");break;case 2:printf("Two"); // 匹配后输出 "Two"// 无 break,继续穿透至 case 3case 3:printf("Three"); // 输出 "Three"break;default:printf("Unknown");
}
// 最终输出 "TwoThree"

7.3 循环语句-for

7.3.1 基本语法结构

for(表达式1; 表达式2; 表达式3) {// 循环体
}
  • 表达式1:初始化语句(通常用于定义循环变量,仅在循环开始时执行一次)。
  • 表达式2:循环条件(布尔表达式,决定是否继续循环)。
  • 表达式3:更新语句(通常用于修改循环变量,在每次循环体执行后执行)。

7.3.2执行顺序

  1. 初始化:执行表达式1(为循环变量赋初值)。
  2. 条件检查:判断表达式2是否为 true
    • 若为 true,执行循环体。
    • 若为 false,退出循环。
  3. 更新循环变量:执行表达式3。
  4. 重复步骤2和3,直到条件为 false

7.3.3 示例代码分析 

#include <iostream>
using namespace std;int main() {for(int i = 0; i < 5; i++) {cout << i << endl;}return 0;
}

输出

0
1
2
3
4

执行流程

  1. i 初始化为 0
  2. 检查 i < 50 < 5 为 true),执行循环体输出 0
  3. 执行 i++i 变为 1
  4. 重复条件检查,直到 i = 5 时条件不满足,循环终止。

7.3.4 关键特性

  1. 变量作用域

    • 循环变量可在表达式1中直接定义(如 for(int i = 0; ...)),此时 i 的作用域仅限于循环体内。
    • 若在外部定义(如 int i; for(i = 0; ...)),变量可在循环外访问。
  2. 灵活的表达式

    • 表达式1、表达式3可以为空或包含多个语句(用逗号分隔):
      for(int i = 0, j = 10; i < 5; i++, j--) {// 循环体
      }
      
  3. 无限循环

    for(;;) {// 需要内部通过 break 退出
    }
    

7.3.5 常见用法

  1. 遍历数组

    int arr[] = {1, 2, 3, 4, 5};
    for(int i = 0; i < 5; i++) {cout << arr[i] << " ";
    }
    // 输出:1 2 3 4 5
    
  2. 反向循环

    for(int i = 4; i >= 0; i--) {cout << i << " ";
    }
    // 输出:4 3 2 1 0
    
  3. 嵌套循环

    for(int i = 0; i < 3; i++) {for(int j = 0; j < 3; j++) {cout << "(" << i << "," << j << ") ";}
    }
    // 输出:(0,0) (0,1) (0,2) (1,0) ... (2,2)
    

7.3.6 练习:用for实现1-10求和

#include <iostream>
using namespace std;int main() {int sum = 0; // 初始化累加器为0// for循环:i从1到10,每次递增1for (int i = 1; i <= 10; i++) {sum += i; // 将当前i的值累加到sum}cout << "1到10的和为:" << sum << endl; // 输出结果return 0;
}

前置递增 vs 后置递增

  • i++ 与 ++i 在循环中效果相同,但前置递增(++i)性能略优(对非内置类型更明显)。

7.4 循环语句-while

7.4.1基本语法

while (表达式) {// 语句块
}
  • 执行顺序:先判断表达式是否为 true,若为真则执行循环体,重复此过程直到表达式为 false
  • 特点:若初始条件为 false,循环体一次都不执行。

7.4.2 示例

int i = 0;
while (i < 10) {i++;if (i == 5) continue; // 跳过 i=5 的输出if (i == 8) break;    // 当 i=8 时终止循环cout << i << " ";
}
// 输出:1 2 3 4 6 7

 7.5 循环语句-do/while

 7.5.1语法结构

do {语句块;
} while (表达式);  // 注意:末尾必须有分号
执行顺序
  1. 先执行一次语句块,再判断表达式是否为真。
  2. 若表达式为 true,继续循环;若为 false,退出循环。

7.5.2 与 while 循环的关键区别

特性while 循环do/while 循环
执行顺序先判断条件,再执行循环体先执行循环体,再判断条件
最少执行次数0 次(条件初始为 false 时)1 次(无论条件是否满足)

7.5.3 示例代码分析

#include <iostream>
using namespace std;int main() {int i = 0;// while 循环(被注释的原始代码)// while (i < 5) {//     cout << i << endl;//     i++;// }// do/while 循环do {cout << i << endl;i++;} while (i < 5);return 0;
}
输出结果

两种循环均输出:

0
1
2
3
4

原因

  • i 初始值为 0,满足 i < 5 的条件。
  • 两种循环均执行 5 次,直到 i 递增到 5 时退出。

7.6 练习题 

编写一个程序,该程序读取整数,直到输入0,输入终止后,程序

应该报告输入的偶数(不包括0)总个数,偶数的平均值,输入的奇数总个数以及

奇数的平均值。

 

#include <iostream>  // 输入输出流库
#include <iomanip>   // 输入输出格式控制库using namespace std;  // 使用标准命名空间int main() {// 变量声明int num;                // 存储用户输入的临时变量int evenCount = 0;      // 偶数计数器int evenSum = 0;        // 偶数和int oddCount = 0;       // 奇数计数器int oddSum = 0;         // 奇数和// 用户输入提示cout << "Enter integers (0 to stop):\n";// 持续读取输入直到遇到0或非整数输入while (cin >> num && num != 0) {if (num % 2 == 0) {  // 判断是否为偶数evenCount++;     // 偶数计数增加evenSum += num;  // 累加偶数和} else {              // 奇数情况oddCount++;       // 奇数计数增加oddSum += num;    // 累加奇数和}}// 计算平均值(处理除零情况)// 使用 static_cast 确保浮点数除法double evenAvg = evenCount > 0 ? static_cast<double>(evenSum) / evenCount : 0.0;double oddAvg = oddCount > 0 ? static_cast<double>(oddSum) / oddCount : 0.0;// 设置固定小数点格式,保留两位小数cout << fixed << setprecision(2);// 输出统计结果cout << "Even numbers: " << evenCount << ", average: " << evenAvg << endl;cout << "Odd numbers: " << oddCount << ", average: " << oddAvg << endl;return 0;  // 程序正常退出
}

七、数组

8.1 定义

数组是具有相同数据类型内存连续的若干个变量的集合,组成数组的变量称为元素。


8.2 特点

  1. 数据类型相同
  2. 内存空间连续
  3. 支持随机访问(通过下标直接访问)

8.3 声明格式

[存储类型] 数据类型 数组名[元素个数];
  • 存储类型auto(默认)、staticextern
  • 元素个数:必须是常量表达式(C89标准)

8.4 初始化

  1. 全部初始化:可省略元素个数
    int arr[] = {1, 2, 3};  // 自动推断为 arr[3]
    
  2. 部分初始化:未初始化的元素自动补0
    int arr[5] = {1, 2};  // [1, 2, 0, 0, 0]
    
  3. 未初始化:元素值为随机值(静态数组自动初始化为0)

8.5 字符数组

初始化方式:
  1. 逐个字符初始化(需手动添加结尾符)
    char st[32] = {'a', 'b', 'c', '\0'};  // 显式添加结束符
  2. 字符串字面量初始化(自动补\0
    char st[32] = "hello";  // 实际占用6字节(含\0)
    char buf[] = "world";    // 自动推断为 buf[6]
    
关键区别:
  • char s[] = {'a','b','c'}; → 长度为3,无结束符
  • char s[] = "abc"; → 长度为4,包含\0

8.6 练习:斐波那契数列逆序输出 

#include <iostream>
using namespace std;int main() {int arr[10] = {1, 1};  // 初始化前两项// 生成数列(从第3项开始)for (int i = 2; i < 10; i++) {arr[i] = arr[i-1] + arr[i-2];}// 逆序输出for (int i = 9; i >= 0; i--) {cout << arr[i] << " ";}return 0;
}

九、指针

9.1 概念

  • 地址:内存最小存储单元是字节,每个存储单元都有唯一编号(地址)
  • 指针变量:专门存储内存地址的变量(大小固定:32位系统4字节/64位系统8字节)
  • 指针本质:地址值的代称,指针变量是地址的容器

9.2 定义格式

[存储类型] 数据类型 *变量名; 
// 示例
int *p1;         // 指向int类型的指针
char *p2;        // 指向char类型的指针
double *p3 = nullptr; // 初始化为空指针

9.3 核心运算符

运算符作用示例
&取变量地址&num → 获取num的地址
*解引用(访问地址内容)*p → 获取指针指向的值

9.4 指针运算

9.4.1 赋值运算

int num = 10;
int *p = &num;  // 指向变量
int arr[3] = {1,2,3};
p = arr;        // 指向数组首地址
int *p2 = p;    // 指针间赋值

9.4.2 算术运算

  • 特点:以数据类型大小为步长
int arr[5] = {10,20,30,40,50};
int *p = arr;
p++;       // 移动sizeof(int)字节 → 指向arr[1]
p += 2;    // 指向arr[3]
int diff = p - arr; // 结果3(间隔元素个数)

9.4.3 关系运算
  • 规则:比较内存地址高低(需指向同一连续内存区域)
int *p1 = &arr[0];
int *p2 = &arr[2];
cout << (p1 < p2);  // 输出1(true)

9.5 练习

练习使用指针实现字符串转换整数

如:"234" -->234

#include <iostream>
using namespace std;int string_to_int(const char* str) {int result = 0;// 遍历字符串直到结束符while (*str != '\0') {// 将当前字符转换为数字并累加到结果中result = result * 10 + (*str - '0');str++; // 移动指针到下一个字符}return result;
}int main() {const char* str = "234";int num = string_to_int(str);cout << num << endl; // 输出: 234return 0;
}

总结

        C++作为Bjarne Stroustrup在1980年代开发的通用高效编程语言,融合了C语言的底层控制能力和面向对象、泛型编程等高级特性,成为系统开发、游戏引擎和高性能计算领域的核心工具。其演进历程从“C with Classes”到C++11/20的现代化改进,持续引入自动类型推导、智能指针、协程等特性,平衡性能与开发效率。文章系统解析了C++的起源、多范式支持、内存管理机制、开发环境搭建(如Qt工具链)、语法结构(词法符号、控制语句)、数据存储(变量、数组、指针)及输入输出操作,同时探讨了其灵活性与复杂性的双重特征,为开发者提供了从基础到实践的全面指南。

相关文章:

C++编程语言:从高效系统开发到现代编程范式的演进之路

目录 前言一、c简介1.1 起源1.2 c的特点 二、开发环境搭建 2.1. 安装 Qt 开发工具2.2 修改编码环境 2.3创建第一个 Qt 项目2.4 c的编译过程2.5 代码示例 2.6 qt疑难杂症 2.6.1 遇到无法删除代码&#xff0c;一点击光标就变成小黑块2.6.2 遇到运行不弹出终端 ​编辑 2.6.3 遇到…...

OpenCV进阶操作:角点检测

文章目录 一、角点检测1、定义2、检测流程1&#xff09;输入图像2&#xff09;图像预处理3&#xff09;特征提取4&#xff09;角点检测5&#xff09;角点定位和标记6&#xff09;角点筛选或后处理&#xff08;可选&#xff09;7&#xff09;输出结果 二、Harris 角点检测&#…...

广州华锐视点邀您参与2025广交会VRAR展【5月10-12日】

2025 广交会数字显示与元宇宙生态博览会暨第 9 届世界 VR&AR 展将在广州盛大举行 。时间&#xff1a;2025 年 5 月 10 日至 12 日&#xff0c;广州华锐视点作为一家深耕 VR、AR、AI、元宇宙内容制作领域的企业&#xff0c;也将携旗下众多创新产品和解决方案闪耀登场&#x…...

mac m2 安装 hbase

默认安装好了 homebrew。 1. 终端先更新下 homebrew brew upgrade再安装 hbase brew install hbase 安装完会有如下图的内容 2. 按照提示启动 hbase brew services start hbase返回启动成功 3. 访问 http://localhost:16010 检验一下 启动成功 4. 在启动 hbase shell之…...

k8s node 报IPVS no destination available

在 Kubernetes 集群中&#xff0c;IPVS no destination available 错误通常表示 kube-proxy&#xff08;IPVS 模式&#xff09;无法为 Service 找到可用的后端 Pod。这会导致流量无法正确转发&#xff0c;影响服务可用性。以下是详细的排查和解决方法&#xff1a; 一、错误原因…...

MySQL 中 EXISTS (SELECT 1 FROM ...) 的用法详解

EXISTS (SELECT 1 FROM ...) 是 MySQL 中用于存在性检查的核心语法&#xff0c;其核心逻辑是判断子查询是否返回至少一行数据。以下从作用原理、使用场景、性能优化等方面展开解析&#xff0c;并结合具体示例说明。 1. 基本语法与作用原理 语法结构&#xff1a; SELECT 列名 F…...

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者&#xff1a;曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能&#xff0c;也就是开发与运营之间的桥梁。它既不直接参与玩家行为&#xff0c;又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…...

前端-HTML+CSS+JavaScript+Vue+Ajax概述

HTML&#xff08;超文本标记语言&#xff09;常见标签 <html><head> <title>这是标题的内容&#xff0c;显示在浏览器的头部</title></head><body><!-- 这里面的内容在浏览器显示给用户看 --><!-- h1 -> h6 : 标题从大到小 …...

20250506格式化NanoPi NEO开发板使用Ubuntu core16.04系统的TF启动卡

https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip 20250506使用SDCardFormatter工具格式化NanoPi NEO开发板使用Ubuntu core16.04系统的TF启动卡 2025/5/6 20:04 缘起&#xff1a;使用友善之臂的NanoPi NEO开发板&#xff0c;制作了Ubunt…...

信息时代的政治重构:网络空间与主权的未来

一、网络空间&#xff1a;暴力垄断的终结 无边界主权的崛起 网络空间作为“第五阶段”的暴力竞争场域&#xff0c;打破传统领土垄断。政府无法像控制物理世界那样垄断网络暴力&#xff0c;类似公海的法律真空状态。 边区类比&#xff1a;中世纪的安道尔&#xff08;法西共管避…...

Kotlin重构Android项目实践

以下是使用 Kotlin 重构 Android 项目的 5 个常见场景实践&#xff0c;通过对比 Java 实现方式&#xff0c;展示 Kotlin 的简洁性和现代特性&#xff1a; 场景 1&#xff1a;数据类替代 Java POJO Java 传统实现&#xff1a; public class User {private String name;private…...

Vue + Element UI 表单弹窗输入法卡顿问题解决方案

Vue Element UI 表单弹窗输入法卡顿问题解决方案 前言 在使用 Vue 和 Element UI 开发后台管理系统时&#xff0c;经常会遇到 el-dialog 弹出表单对话框的场景。然而&#xff0c;很多开发者可能会遇到一个棘手的问题&#xff1a;当调用 resetFields() 方法重置表单时&#x…...

ubantu安装CUDA

想要通过llama.cpp的方式跑deepseek R1模型。在按照https://huggingface.co/unsloth/DeepSeek-R1-GGUF教程去配环境时报错了。具体如下&#xff1a; (base) oemcore:~/Desktop/deepseek_llama.cpp$ sudo cmake llama.cpp -B llama.cpp/build -DBUILD_SHARED_LIBSOFF -DGGM…...

Python生活手册-Numpy多维数组构建:从快递分拣到智能家居的数据变形术

一、快递分拣系统&#xff08;基础构建&#xff09; 1. 电子面单生成&#xff08;列表转数组&#xff09; import numpy as np手工录入的快递单号 纸质单号 [["SF123", "JD456", "EMS789"],["YT012", "ZT345", "YZ6…...

数据库的范围查询

范围查询 B树迭代器 迭代器接口 B树的基本操作包括用于范围查询的查找和迭代。B树的位置由状态化的迭代器 BIter 表示。 // 查找小于或等于输入键的最近位置 func (tree *BTree) SeekLE(key []byte) *BIter// 获取当前键值对 func (iter *BIter) Deref() ([]byte, []byte)/…...

JS DAY4 日期对象与节点

一日期对象 日期对象:用来表示时间的对象 作用:可以得到当前系统时间 1.实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间 时间必须实例化 获得当前时间 const date new Date() 获得指定时间 const date new Date(…...

【Leetcode 每日一题 - 补卡】1007. 行相等的最少多米诺旋转

问题背景 在一排多米诺骨牌中&#xff0c; t o p s [ i ] tops[i] tops[i] 和 b o t t o m s [ i ] bottoms[i] bottoms[i] 分别代表第 i i i 个多米诺骨牌的上半部分和下半部分。&#xff08;一个多米诺是两个从 1 1 1 到 6 6 6 的数字同列平铺形成的 —— 该平铺的每一半…...

Android设备运行yolov8

放假这几天搞了一个基于uniapprk3588实现了一版yolo检测 这个是基于前端调用后端api来实现&#xff0c;感觉还可以&#xff0c;但是需要有网络才能进行图像检测&#xff0c;网络不稳定就会出现等待时间会比较久的问题&#xff0c;然后有做了一个在做了一个Android版本的图像检…...

Debezium MySqlValueConverters详解

Debezium MySqlValueConverters详解 1. 类的作用与功能 1.1 核心作用 MySqlValueConverters是Debezium中负责MySQL数据类型转换的核心类,主要功能包括: 数据类型映射:将MySQL的数据类型映射到Kafka Connect的Schema类型值转换:将MySQL的原始值转换为Kafka Connect可用的…...

Redis从入门到实战——实战篇(下)

四、达人探店 1. 发布探店笔记 探店笔记类似于点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等tb_blog_comments&#xff1a;其他用户对探店笔记的评价 步骤①&#xff1…...

算法中的数学:质数(素数)

1.质数 1.1定义 一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除&#xff0c;那么他就是质数&#xff0c;否则他就是合数。 注意&#xff1a;1既不是质数也不是合数 唯一的偶质数是2&#xff0c;其余所有质数都是奇质数 1.2质数判定求法 试除法…...

linux、window安装部署nacos

本文以nacos 2.2.0为例 文章目录 1.下载安装包2.按需修改配置配置单机模式配置内存 -Xms -Xmx -Xmn配置数据库为MySQL 3. 访问http://ip:8848/nacos4.常见问题找不到javac命令 1.下载安装包 打开官网&#xff0c;下载2.2.0版本 2.按需修改配置 配置单机模式 默认集群模式&…...

C++ 外观模式详解

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为复杂的子系统提供一个简化的接口。 概念解析 外观模式的核心思想是&#xff1a; 简化接口&#xff1a;为复杂的子系统提供一个更简单、更统一的接口 降低耦合&#xff1a;减少客户端与子…...

42. 接雨水(相向双指针/前后缀分解),一篇文章讲透彻

给定一个数组&#xff0c;代表柱子的高度 求出下雨之后&#xff0c;能接的水有多少单位。我们将每一个柱子想象成一个水桶&#xff0c;看他能接多少水 以这个水桶为例&#xff0c;他所能接的水取决于左边的柱子的最大高度和右边柱子的最大高度&#xff0c;因为只有柱子高的时候…...

vue实现AI问答Markdown打字机效果

上线效果 功能清单 AI问答&#xff0c;文字输出跟随打字机效果格式化回答内容&#xff08;markdown格式&#xff09;停止回答&#xff0c;复制回答内容回答时自动向下滚动全屏切换历史问答查看 主要技术 vue 2.7.1markdown-it 14.1.0microsoft/fetch-event-source 2.0.1high…...

【QT】QT中的事件

QT中的事件 1.事件的定义和作用2.QT中事件产生和派发流程2.1 步骤2.2 图示示例代码&#xff1a;&#xff08;event函数接收所有事件&#xff09; 3.常见的事件3.1 鼠标事件示例代码&#xff1a;现象&#xff1a; 3.2 按键事件3.3 窗口大小改变事件 4.举例说明示例代码&#xff…...

【QT】QT中的软键盘设计

QT的软键盘设计 1.软键盘制作步骤2.介绍有关函数的使用3.出现的编译错误及解决办法示例代码1&#xff1a;按键事件实现软键盘现象&#xff1a;示例代码2&#xff1a;按键事件实现软键盘&#xff08;加特殊按键&#xff09;现象&#xff1a; 软键盘移植到新的工程的步骤&#xf…...

【Unity】一个AssetBundle热更新的使用小例子

1.新建两个预制体&#xff1a; Cube1&#xff1a;GameObject Material1&#xff1a;Material Cube1使用了Material1材质 之后设置打包配置 Cube1的打包配置为custom.ab Material1的打包配置为mat.ab 2.在Asset文件夹下创建Editor文件夹&#xff0c;并在Editor下创建BuildBundle…...

【Bootstrap V4系列】学习入门教程之 组件-按钮组(Button group)

Bootstrap V4系列 学习入门教程之 组件-按钮组&#xff08;Button group&#xff09; 按钮组&#xff08;Button group&#xff09;一、Basic example二、Button toolbar 按钮工具条三、Sizing 尺寸四、Nesting 嵌套五、Vertical variation 垂直变化 按钮组&#xff08;Button …...

Linux进程间的通信

IPC 即 Inter-Process Communication&#xff0c;也就是进程间通信&#xff0c;它指的是在不同进程之间进行数据交换和协调同步的机制。在操作系统里&#xff0c;每个进程都有自己独立的内存空间&#xff0c;一般情况下不能直接访问其他进程的内存&#xff0c;所以需要借助 IPC…...

常用非对称加密算法的Python实现及详解

非对称加密算法&#xff08;Asymmetric Encryption&#xff09;使用公钥加密、私钥解密&#xff0c;解决了对称加密的密钥分发问题。本文将详细介绍 RSA、ECC、ElGamal、DSA、ECDSA、Ed25519 等非对称加密算法的原理&#xff0c;并提供Python实现代码及安全性分析。 1. 非对称加…...

【题解-洛谷】B4303 [蓝桥杯青少年组省赛 2024] 字母移位

题目&#xff1a;B4303 [蓝桥杯青少年组省赛 2024] 字母移位 题目描述 字母移位表示将字母按照字母表的顺序进行移动。 例如&#xff0c; b \texttt{b} b 向右移动一位是 c \texttt{c} c&#xff0c; f \texttt{f} f 向左移动两位是 d \texttt{d} d。 特别地&#xff0c;…...

详讲viewer查看器

将Python与Cesium结合起来&#xff0c;可以实现高效的数据处理与可视化展示。本文将详细介绍如何在Python环境中集成Cesium&#xff0c;以及实现数据可视化的具体方法。 我们可以通过在app.vue中的修改来更改我们查看器的显示方法 修改前 修改后 还可以进行各式各样的自定义操作…...

开关电源原理

开关电源原理 一、 开关电源的电路组成&#xff1a; 开关电源的主要电路是由输入电磁干扰滤波器&#xff08;EMI&#xff09;、整流滤波电路、功率变换电路、PWM控制器电路、输出整流滤波电路组成。辅助电路有输入过欠压保护电路、输出过欠压保护电路、输出过流保护电路、输出短…...

数据库的并发控制

并发控制 12.1 并发级别 问题&#xff1a;交错的读写 并发客户端可以随意进入和退出事务&#xff0c;并在中途请求读取和写入。为了简化分析&#xff0c;假设enter/exit/read/write是原子步骤&#xff0c;因此并发事务只是这些步骤的交错。 我们还将区分只读事务和读写事务…...

力扣第448场周赛

赛时成绩如下: 这应该是我力扣周赛的最好成绩了(虽然还是三题) 1. 两个数字的最大乘积 给定一个正整数 n。 返回 任意两位数字 相乘所得的 最大 乘积。 注意&#xff1a;如果某个数字在 n 中出现多次&#xff0c;你可以多次使用该数字。 示例 1&#xff1a; 输入&#xff1…...

关于Python:9. 深入理解Python运行机制

一、Python内存管理&#xff08;引用计数、垃圾回收&#xff09; Python&#xff08;CPython&#xff09;采用的是&#xff1a; “引用计数为主&#xff0c;垃圾回收为辅” 的内存管理机制。 也就是说&#xff1a; 引用计数机制&#xff1a;负责大部分内存释放&#xff0c;简…...

Cron表达式的用法

最近几天开发东西用到了定时脚本的问题&#xff0c;中间隔了一段时间没有用到&#xff0c;再次复习一下Cron表达式的用法。 Cron表达式是一种用于定义定时任务执行时间的字符串格式&#xff0c;广泛应用于Unix/Linux系统以及各种编程语言中。其主要用途是通过灵活的时间规则来…...

手机通过局域网访问网狐接口及管理后台网站

1.本地部署接口及后台网站 2.设置允许网站端口通过防火墙 3.查看网站服务器IP 4.手机连接到本地服务器同一局域网 5.手机访问本地服务器接口...

JavaSE核心知识点01基础语法01-01(关键字、标识符、变量)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点01基础语法01-01&#xff0…...

Sliding Window Attention(Longformer)

最简单的自注意力大家肯定都会啦。 但这种全连接的自注意力&#xff08;即每个 token 需要 attend 到输入序列中的所有其他 token&#xff09;计算与内存开销是 O ( n 2 ) O(n^2) O(n2) 。为了缓解这个问题&#xff0c;研究者们提出了 Sliding Window Attention。 Sliding W…...

ROS2 开发踩坑记录(持续更新...)

1. 从find_package(xxx REQUIRED)说起&#xff0c;如何引用其他package(包&#xff09; 查看包的安装位置和include路径详细文件列表 例如&#xff0c;xxx包名为pluginlib # 查看 pluginlib 的安装位置 dpkg -L ros-${ROS_DISTRO}-pluginlib | grep include 这条指令的目的是…...

刷leetcodehot100返航版--哈希表5/5、5/6

回顾一下之前做的哈希&#xff0c;貌似只有用到 unordered_set&#xff1a;存储无序元素unordered_map&#xff1a;存储无序键值对 代码随想录 常用代码模板2——数据结构 - AcWing C知识回顾-CSDN博客 1.两数之和5/5【30min】 1. 两数之和 - 力扣&#xff08;LeetCode&am…...

嵌入式开发学习日志Day13

第九章 预处理命令 前面加“#”的都为预处理命令&#xff1b; 预处理命令是无脑的文本替换&#xff1b; 一、宏定义 1、不带参数的宏定义 一般形式为&#xff1a; #define 标识符 字符串 &#xff08;谷歌规定&#xff09;&#xff1a;所有的宏名均大写&#xff0c;便于…...

AI预测的艺术品走势靠谱吗?

首席数据官高鹏律师团队 AI预测艺术品价格走势&#xff1a;技术与法律的双重考量在当今数字化浪潮席卷全球的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度渗透到各个领域&#xff0c;艺术品市场也不例外。AI预测艺术品价格走势这一新兴事物&…...

AVL树 和 红黑树 的插入算法

1.AVL树 按照二叉搜索树的规则找到要插入的位置并插入&#xff0c;插入过后看是父节点的左还是右孩子&#xff0c;然后把父节点的平衡因子-1或1&#xff0c;调整后如果父节点的平衡因子是0&#xff0c;那就说明这颗子树的高度插入前后不变&#xff0c;上面的就不用调整平衡因子…...

【项目】基于ArkTS的网吧会员应用开发(1)

一、效果图展示 二、界面讲解 以上是基于ArkTS的鸿蒙应用网吧会员软件的引导页&#xff0c;使用滑动组件滑动页面&#xff0c;至最后一页时&#xff0c;点击立即体验&#xff0c;进入登录页面。 三、代码演示 import promptAction from ohos.promptAction; import router fr…...

命令模式(Command Pattern)

非常好&#xff01;现在我们来深入讲解行为型设计模式之一 —— 命令模式&#xff08;Command Pattern&#xff09;。 我将通过&#xff1a; ✅ 定义解释 &#x1f3af; 使用动机 &#x1f40d; Python 完整调用代码&#xff08;含注释&#xff09; &#x1f9ed; 清晰类图 …...

CMake基础介绍

1、CMake 概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的&#xff1b;关于项目构建目前比较流行的还有 Makefile(通过 Make 命令进行项目的构建)&#xff0c; 大多 IDE 软件都集成了 make,比如&#xff1a;VS 的 nmake、linux 下的 GNU make、Qt 的 qmake 等&…...

偷钱包行为检测数据集VOC+YOLO格式922张1类别有增强

有320张图片是原图剩余为增强图片 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;922 标注数量(xml文件个数)&#xff1a;922 标注数量…...