深入计算机语言之C++:C到C++的过度

  🔑🔑博客主页:阿客不是客

🍓🍓系列专栏:从C语言到C++语言的渐深学习

欢迎来到泊舟小课堂

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注

一、什么是C++

C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。

我们之前学习的C语言就是一种面向过程的语言,它强调事件的具体实现过程,一般以函数来具体实现。C++就是一门典型的面向对象的语言,它将问题分成多个对象,更强调对象与对象之间的联系。它完善了C语言的许多缺陷,并且引入了面向对象的程序设计思想,包括面向对象的四个特性:封装继承多态抽象。 

无论是面向过程还是面向对象的语言,都有其优缺点:

面向过程面向对象
优点流程化分工明确,效率高结构化更清晰,易维护
缺点可维护性差,扩展能力差开销大,性能低

二、C++的标准库

标准的 C++ 由三个重要部分组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

这三个部分包含了C++这门语言的核心,我们后面的内容就主要围绕上面三个部分展开。

三、第一个C++程序

C++兼容C语言的大多数语法,所以C语言实现的 hello world 依旧可以运行,C++中需要把定义文件代码后缀改成.cpp,vs编译器看到是.cpp就会调用C++编译器,Linux下亚勇g++编译,不再是gcc。

当然C++有一套自己的输入输出,严格说C++版本的 hello world 应该是这么写:

// test.cpp 
// 这⾥的std cout等我们都看不懂,没关系,下⾯我们会依次讲解 
#include<iostream> 
using namespace std;int main() 
{cout << "hello world\n" << endl;return 0;
}

四、命名空间

4.1 域作用限定符

作用域限定符:  " : ",其作用是通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。当左侧为空时,默认访问的就是全局域。

#include<iostream>int a = 1;int main()
{int a = 0;printf("%d\n", a);printf("%d\n", ::a);return 0;
}

我们知道C语言遵循局部优先的规则,即当局部变量与全局变量冲突时,默认使用局部变量。而在C++中,我们可以通过域作用限定符来访问全局变量。

输出结果为:

0

1

4.2 为什么要存在命名空间

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决这样的问题

#include<iostream>
#include<stdlib.h>
int rand = 1;
int main()
{printf("%d\n", rand);return 0;
}

当我们定义rand变量时,就会与stdlib库中的rand函数出现命名冲突,这在C语言中只能通过修改变量名称来解决。但是在C++中,我们可以就可以使用命名空间来解决。

4.3 命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

C++标准库都放在⼀个叫std(standard)的命名空间中。

4.3.1 正常的命名空间定义

namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。

#include<iostream>
#include<stdlib.h>
namespace ake
{int rand = 1;
}
int main()
{printf("%d\n", ake::rand);//使用域作用限定符,指定作用域return 0;
}

输出结果为 :1

4.3.2 命名空间的嵌套定义

namespace只能定义在全局,当然他还可以嵌套定义。

#include<iostream>
using namespace std;
namespace ake1
{int a = 1;namespace ake2//嵌套{int Add(int a, int b){return a + b;}}
}
int main()
{cout << ake1::a << endl;//访问通过限定符依次访问cout << ake1::ake2::Add(1, 1) << endl;return 0;
}

4.3.3 多文件中同名定义合并

在同一个工程中(可以是同一个工程下的不同文件),我们可以定义多个名称相同的命名空间,在编译时命名空间会自动合并,认为是⼀个namespace,不会冲突。

namespace ake
{int a = 1;
}
namespace ake
{int b = 1;
}
//编译时会自动合并

4.4 命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

4.4.1 指定命名空间访问

这我们在前面已经实验演示过,现在我们来演示一下访问C++标准命名空间。(cout,endl等常用函数都被定义在C++标准命名空间std中)。

#include<iostream>
int main()
{std::cout << "hello bite" << std::endl;return 0;
}

指定命名空间访问,项⽬中推荐这种⽅式。  

4.4.2 using 部分展开

在我们书写代码时,可能会频繁调用某个函数,这是我们可以使用using部分展开,来简化代码。使用方式为using 命名空间名称:: 成员。

#include<iostream>
#include<stdlib.h>
namespace ake
{int a = 1;int b = 2;
}using ask::a;int main()
{printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", ake::b);return 0;
}

 项⽬中经常访问的不存在冲突的成员推荐这种⽅式

4.4.3 using namespace 全部展开

除了部分展开,自然也有全局展开。其格式为using namespace 命名空间名

#include<iostream>
#include<stdlib.h>
namespace ake
{int a = 1;int b = 2;
}using namespace ask;int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}
展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

五、C++的输入和输出

C++的标准输入与输出函数是cincout,分别对应C语言的printf与scanf。但是相较于C语言,C++输入输出并不需要指定占位符,如:%d,%c等,输出可以⾃动识别变量类型

#include<iostream>
using namespace std;//展开命名空间
int main()
{cout << "hello world" << endl;//endl相当于换行符cout << "hello world" << '\n';cout << 'a' << endl;int b = 1;cout << b << endl;cout << &b << endl;return 0;
}

注:在C++中使用 cin 与 cout 以及 endl 都属于C++标准库,需要包含头文件iostream以及std标准命名空间。

六、缺省参数

6.1 缺省参数的使用

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参缺省值,否则使用指定的实参。

void func(int a = 0)
{cout << a << endl;
}
int main()
{func();  // 没有传参时,使用参数的默认值,输出0func(1); // 传参时,使用指定的实参,输出1return 0;
}

运行结果:

0

1

6.2 缺省参数的分类

根据其缺省参数的个数,我们我可以将缺省参数分为全缺省半缺省。

6.2.1 全缺省

每一个参数都有缺省值。

#include<iostream>
using namespace std;
void func(int a = 0, int b = 1, int c = 2)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;;
}
int main()
{func();//不穿参数func(10, 20);//半传参数func(10, 20, 30);//全传return 0;
}

6.2.2 半缺省

只有一部分参数有缺省值,并且半缺省参数必须从右往左依次来给出,不能间隔着给。同时传参只能从左往右依次传参。

#include<iostream>
using namespace std;
void func(int a ,int b=1,int c=2)
{cout <<"a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{func(10,20);//半传参数cout << endl;func(10, 20, 30);//全传return 0;
}

5.2.3 注意

在使用缺省参数时,我们也要知道一些注意事项:

1. 传参时不能间隔传参

void func(int a ,int b=1,int c=2)
{cout <<"a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
func(,10,20)//error

2. 缺省参数不能在函数的声明和定义同时出现

//test.h
void Func(int a = 10);//声明
// test.cpp
void Func(int a = 20)//定义
{}

七、函数重载

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

可以通过参数类型,参数个数,参数类型顺序来构成函数重载:

int Add(int a, int b)
{return a + b;
}
double Add(double a, double b)//类型不同
{return a + b;
}
int Add(int a, int b, int c)//个数不同
{return a + b;
}int Add(char a, int c)
{return a + c;
}
int Add(int a, char c)//类型顺序不同
{return a + c;
}

注意:

  1. 返回值类型不同无法构成函数重载
  2. 缺省值不同也不能构成函数重载

八、引用

8.1 引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间 。其语法为:

引用对象类型& 引用变量名(对象名) = 引用实体;

引用类似于指针,因为指向同一块空间,所以改变引用变量引用实体也会改变。

#include<iostream>
using namespace std;
int main()
{int a = 1;int& b = a;//引用int& c = b;cout << &a << endl;cout << &b << endl;cout << &c << endl;c++;cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}

8.2 引用的特性

8.2.1 引用时必须初始化

int& b;//错误的,必须初始化int& b = a;

8.2.2 一个变量可以有多个引用(给别名取别名)

int a = 1;
int& b = a;
int& c = a;//多个引用

8.2.3 引用一旦引用一个实体,再不能引用其他实体

int a = 1;
int& b = a;
b = 2;//这时是赋值,相当于a = b = 2;

8.3 引用的使用

8.3.1 作为函数的参数

#include<iostream>
using namespace std;void swap(int& a, int& b)
{int z = a;a = b;b = z;
}int main()
{int a = 1, b = 2;swap(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}

8.3.2 做函数返回值

函数的返回值是存储在一个临时的变量里面。这个变量正常情况下是不可修改的,可以看作一个常量,我们不能对常量进行赋值。

但使用引用作为返回值相当于返回一个引用,没有中间拷贝过程和临时变量,进而同时改变了引用对象(func1(a))和被引用对象(a)。

#include<iostream>
using namespace std;int& func1(int& a)
{a++;return a;
}int main()
{int a = 1;func1(a) = 10;cout << a;return 0;
}

8.3.3 错误示范

1. 引用指向的空间栈帧销毁

int& func()
{int a = 0;return a;
}

返回了a的引用,但当离开函数,函数的栈帧销毁,相当于返回了一个野指针

2. 引用指向的函数多次调用

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << ret <<endl;return 0;
}//输出什么

输出结果为:7 

那是因为在第二次调用函数Add(3,4)时,会在原来第一次调用Add(1,2)建立栈帧的空间上建立栈帧所以返回值c的值会被重新覆盖,ret是指向Add所在位置的栈帧的别名,所以ret值也会发生改变。

8.4 const引用

8.4.1 对常变量的引用(权限不可放大)

我们可以通过 const 修饰引用来让其变为常引用。这时引用变量是不能被修改的,并且只能将常变量复杂给常引用,不能将常变量赋值给引用,必须用const来引用

const int a = 10;
// 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &” 
// 这⾥的引⽤是对a访问权限的放⼤
//int& ra = a;//这样才可以
const int& a = 10;
// 编译报错:error C3892: “ra”: 不能给常量赋值 
//ra++;

8.4.2 const引用普通变量(权限可缩小)

const 引⽤也可以引⽤普通变量,因为对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤。

// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20; const int& rb = b;
// 编译报错:error C3892: “rb”: 不能给常量赋值
//rb++;

8.4.3 const可以引用含有常性的对象

含有常性的变量包括常数,函数返回值等。

const int& ra = 30;
int a = 1, b = 2;
const int& ra = a * 3;
const int& rb = a + b;
double d = 12.34; 
// 编译报错:“初始化”: ⽆法从“double”转换为“int &” 
// int& rd = d;
int rc = d;//隐式类型转换
const int& rd = d;

不需要注意的是类似 int& ra = a*3; int& rb = a + b; int& rd = d; 这样⼀些场景下 a*3 的运算结果和 a 保存在⼀个临时对象中。 int& rd = d 也是类似,引用时进行类型转换被称为隐式类型转换,在类型转换中会产⽣临时对象存储中间值。也就是此时,ra 和 rd 引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。

所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。

注:

const int a = 10;
int& ra = a;//权限放大
int rb = a;//权限没有放大

a处于一块临时对象,只拥有读取权限,没有写入权限,此时 int& ra 是指向a所在的空间(别名),要求读取和写入的权限,所以就产生了权限放大。第二个只是将 a 的值读取拷贝给 rb,并没有产生权限放大。

const 引用传参在未来学习模板类的时候会有进行运用。

8.5 引用与指针的区别

  1. 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个地址的变量,要开空间。
  2. 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
  3. 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
  4. 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
  5. sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
  6. 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

九、内联函数

在C语言中,无论宏常量还是宏函数虽能提升程序运行效,但都有易出错,无法调试等缺陷。而C++为了弥补这一缺陷,引入了内联函数的概念代替宏函数。

以关键字inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{return x + y;
}
int main()
{Add(1, 2);return 0;
}

vs编译器 debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下以下两个地⽅。

C/C++:常规——调试信息格式改成程序数据库,优化——内联函数扩展改成只适用于_inline

注意:

  1. 内联函数是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。内联函数的优势减少了调用开销,提高程序运行效率,缺陷就是可能会使目标文件变大。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
  3. inline不能声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

因为内联函数会在调用时直接展开,编译器默认认为不需要地址,如果声明与定义分离内联函数的地址根本不会进入符号表,链接时就无法找到定义的函数,就会发生链接错误。

十、nullptr

在C语言中,定义了一个宏NULL,在传统的C头文件(stddef.h)中,可以看到如下代码 :

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

由此我们知道NULL既可以代表数字0,也可以代表空指针。这种模棱两可的定义就可能引出一些问题,比如下面这段代码:

#include<iostream>
using namespace std;
void func(int a)
{cout << "func(int)" << endl;
}
void func(int*p)
{cout << "func(int*)" << endl;
}
//函数重载
int main()
{func(0);func(NULL);func((int*)NULL);return 0;//输出??
}

我们的本意可能是将NULL当成一个指针,但是在默认情况下NULL被编译器当做数字0。这种问题是我们并不想看见的,所以C++11引入了nullptr来代替NULL。

C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439136.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用NumPy进行线性代数的快速指南

介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作&#xff0c;这对于数据分析和科学计算至关重要。在本指南中&#xff0c;我们将探讨 NumPy 中可用的一些基本线性代数操作&#xff0c;展示如何通过运算符重载和内置函数执行这些操作。 元素级…

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

Linux 文件 IO 管理&#xff08;第四讲&#xff1a;软硬链接和动静态库&#xff09; 软硬链接操作与现象软链接硬链接 解释软链接硬链接作用 动静态库初识静态库怎么做库&#xff08;开发角度&#xff09;怎么用库&#xff08;使用角度&#xff09;安装当前目录直接使用 动态库…

打卡第一天 B2005 字符三角形

今天是我打卡第一天&#xff0c;就做个水题吧(#^.^#) 题目描述 给定一个字符&#xff0c;用它构造一个底边长 55 个字符&#xff0c;高 33 个字符的等腰字符三角形。 输入格式 输入只有一行&#xff0c;包含一个字符。 输出格式 该字符构成的等腰三角形&#xff0c;底边长…

全新一区PID搜索算法+TCN-LSTM+注意力机制!PSA-TCN-LSTM-Attention多变量时间序列预测(Matlab)

全新一区PID搜索算法TCN-LSTM注意力机制&#xff01;PSA-TCN-LSTM-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 全新一区PID搜索算法TCN-LSTM注意力机制&#xff01;PSA-TCN-LSTM-Attention多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本…

今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面

今日凌晨&#xff0c;ChatGPT重磅更新&#xff01;—— 我心目中的终极AGI界面 我心目中的终极 AGI 界面是一张空白画布&#xff08;canvas&#xff09;。 今日凌晨&#xff0c;OpenAI 发布 canvas&#xff0c;一个与 ChatGPT 合作写作和编程的新界面&#xff01; canvas&…

MySQL 启动失败 (code=exited, status=1/FAILURE) 异常解决方案

目录 前言1. 问题描述2. 查看错误日志文件2.1 确认日志文件路径2.2 查看日志文件内容 3. 定位问题3.1 问题分析 4. 解决问题4.1 注释掉错误配置4.2 重启 MySQL 服务 5. 总结结语 前言 在日常运维和开发过程中&#xff0c;MySQL数据库的稳定运行至关重要。然而&#xff0c;MySQ…

Leetcode—148. 排序链表【中等】

2024每日刷题&#xff08;171&#xff09; Leetcode—148. 排序链表 C实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…

森林火灾检测数据集 7400张 森林火灾 带标注 voc yolo

森林火灾检测数据集 7400张 森林火灾 带标注 voc yolo 森林火灾检测数据集 名称 森林火灾检测数据集 (Forest Fire Detection Dataset) 规模 图像数量&#xff1a;共7780张图像。类别&#xff1a;仅包含一种类别——火源。 数据划分 训练集 (Train)&#xff1a;通常占总数据…

SpringBoot整合JPA详解

SpringBoot版本是2.0以上(2.6.13) JDK是1.8 一、依赖 <dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--…

Oracle SQL语句没有过滤条件,究竟是否会走索引??

答案是&#xff1a;可能走索引也可能不走索引&#xff0c;具体要看列的值可不可为null&#xff0c;Oracle不会为所有列的nullable属性都为Y的sql语句走索引。 例子&#xff1a; create table t as select * from dba_objects; CREATE INDEX ix_t_name ON t(object_id, objec…

9.30学习记录(补)

手撕线程池: 1.进程:进程就是运行中的程序 2.线程的最大数量取决于CPU的核数 3.创建线程 thread t1; 在使用多线程时&#xff0c;由于线程是由上至下走的&#xff0c;所以主程序要等待线程全部执行完才能结束否则就会发生报错。通过thread.join()来实现 但是如果在一个比…

SpringBoot助力校园资料分享:快速上手指南

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多学生、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

多模态—文字生成图片

DALL-E是一个用于文字生成图片的模型&#xff0c;这也是一个很好思路的模型。该模型的训练分为两个阶段&#xff1a; 第一阶段&#xff1a;图片经过编码器编码为图片向量&#xff0c;当然我们应该注意这个过程存在无损压缩&#xff08;图片假设200*200&#xff0c;如果用one-h…

MATLAB|基于多主体主从博弈的区域综合能源系统低碳经济优化调度

目录 主要内容 程序亮点&#xff1a; 模型研究 一、综合能源模型 二、主从博弈框架 部分代码 结果一览 下载链接 主要内容 程序参考文献《基于多主体主从博弈的区域综合能源系统低碳经济优化调度》&#xff0c;采用了区域综合能源系统多主体博弈协同优化方…

Redis-预热雪崩击穿穿透

预热雪崩穿透击穿 缓存预热 缓存雪崩 有这两种原因 redis key 永不过期or过期时间错开redis 缓存集群实现高可用 主从哨兵Redis Cluster开启redis持久化aof&#xff0c;rdb&#xff0c;尽快恢复集群 多缓存结合预防雪崩&#xff1a;本地缓存 ehcache redis 缓存服务降级&…

国产RISC-V案例分享,基于全志T113-i异构多核平台!

RISC-V核心优势 全志T113-i是一款双核Cortex-A7@1.2GHz国产工业级处理器平台,并内置玄铁C906 RISC-V和HiFi4 DSP双副核心,可流畅运行Linux系统与Qt界面,并已适配OpenWRT系统、Docker容器技术。 而其中的RISC-V属于超高能效副核心,主频高达1008MHz,标配内存管理单元,可运…

程序员如何在 AI 时代保持核心竞争力

前言 随着 AIGC 大语言模型的不断涌现&#xff0c;AI 辅助编程工具的普及正在深刻改变程序员的工作方式。在这一趋势下&#xff0c;程序员面临着新的挑战与机遇&#xff0c;需要思考如何应对以保持并提升自身的核心竞争力。 目录 一、AI 对编程工作的影响 &#xff08;一&…

一“填”到底:深入理解Flood Fill算法

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 floodfill算法是什么&#xff1f; 二 相关OJ题练习 2.1 图像渲染 2.2 岛屿数量 2.3 岛屿的最大面积 2.4 被围绕的区域 2.5 太平洋大西洋水流问题 2.6 扫雷游戏 2.7 衣橱整…

matlab r2024a、matlab R2024b保姆级安装教程

​ 1.安装步骤 右键【setup.exe】以【管理员身份运行】 点击【高级选项】-【我有文件安装密钥】 点击【是】-【下一步】 输入密钥【21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-…